ควรใช้ local รัน rm -rf แทน over nfs หรือไม่


10

มันจะสร้างความแตกต่างในเวลาที่จะเข้าสู่ระบบในเครื่องที่มีไดเรกทอรีก่อนที่จะทำrm -rfในไดเรกทอรีหรือเพียงrm -rfไดเรกทอรีมากกว่า NFS?

คำตอบ:


11

แน่นอน ssh ดีกว่า

Nfs ใช้โปรโตคอลเครือข่ายที่ซับซ้อนพร้อมการเรียกขั้นตอนระยะไกลที่หลากหลายและการประสานเวลารอข้อมูล ในกรณีของ ssh สิ่งเหล่านี้ใช้ไม่ได้

นอกจากนี้ยังมีล็อคจำนวนมาก การลบไฟล์ใน nfs ทำงานด้วยวิธีนี้:

  1. rmคำสั่งของคุณให้unlink()syscall
  2. ไดรเวอร์ nfs แปลงเป็นคำร้องขอ sunrpc ส่งไปยังเซิร์ฟเวอร์ nfs
  3. เซิร์ฟเวอร์ nfs แปลงคำขอ sunrpc นี้กลับไปสู่การunlink()โทร
  4. เรียกใช้การunlink()โทรนี้ทางด้านระยะไกล
  5. หลังจากประสบความสำเร็จส่งคืนข้อความตอบกลับ rpc ที่เทียบเท่ากับ "เอาล่ะก็ทำได้" ให้กับลูกค้า
  6. เคอร์เนลไดรเวอร์ของฝั่งไคลเอ็นต์จะแปลงกลับไปเป็นรหัสทางออก 0 ของการunlink()โทรเดิมของคุณrm
  7. rm วนซ้ำเป็นไฟล์ถัดไปข้ามไป 1

ตอนนี้สิ่งสำคัญคือระหว่าง 2-7 rmต้องรอ มันสามารถส่งการunlink()เรียกครั้งต่อไปแบบอะซิงโครนัส แต่เป็นเครื่องมือแบบเธรดเดียวไม่ใช่เหตุการณ์เชิง แม้ว่าจะทำได้ แต่ก็ยังต้องใช้แฟล็กเมาท์ nfs ที่ยุ่งยาก จนกว่าจะไม่ได้ผลลัพธ์ก็จะรอ

Nfs - และระบบไฟล์เครือข่ายใด ๆ - จะช้ากว่าเสมอ


ในหลายกรณีคุณสามารถทำการลบซ้ำด้วยความเร็วเสมือนจริงโดยใช้กลอุบาย:

  1. ขั้นแรกย้ายไดเรกทอรีไปยังชื่ออื่น ( mv -vf oldfilms oldfilms-)
  2. ลบในพื้นหลัง ( rm -rf oldfilms- &)

จากหลาย ๆ แง่มุม (แต่ไม่ใช่ทั้งหมด) การลบไดเรกทอรีนี้จะดูราวกับว่ามันเกิดขึ้นในเวลาจริง


ส่วนขยาย:ตามที่ @ el.pascado กล่าวถึงในความคิดเห็นที่ยอดเยี่ยมของเขาจริง ๆ แล้ว 2-7 ต้องเรียกใช้3xสำหรับไฟล์ใด ๆ :

  • เพื่อตรวจสอบว่ามันเป็นไฟล์หรือไดเรกทอรี (มีlstat()syscall)
  • จากนั้นทำตาม ในกรณีที่ไฟล์ธรรมดาunlink()ในกรณีของไดเรกทอรีopendir()ลบไฟล์ทั้งหมดที่ไดเรกทอรี / ในนั้นซ้ำแล้วในที่สุดclosedir()rmdir()
  • ท้ายที่สุดให้วนซ้ำไปยังรายการไดเรกทอรีถัดไปด้วยการreaddir()โทร

สิ่งนี้จำเป็นต้องใช้คำสั่ง 3 nfs RPC สำหรับไฟล์และอีก 3 คำสั่งสำหรับไดเรกทอรี


2
กรณี nfs ยิ่งแย่ลง ในฐานะที่เป็นคำถามที่กล่าวถึง-rธงrmต้องตรวจสอบก่อนว่าไฟล์เป็นไดเรกทอรี ( lstatผ่าน NFS) เปิดมัน ( opendirผ่าน NFS) อ่านเนื้อหา ( readdirผ่าน NFS) และจากนั้นทำการลบจริงตามที่อธิบายไว้ในคำตอบในทุกไฟล์ที่พบภายในและ เรียกใช้ซ้ำในไดเรกทอรีย่อยปิดไดเรกทอรี ( closedirผ่าน nfs) จากนั้นทำซ้ำสำหรับทุก dir ที่พบ
el.pescado

5

ใช่. อาจจะ มันขึ้นอยู่กับ. สำหรับไฟล์และไดเร็กตอรี่จำนวนน้อยมันไม่ได้แตกต่างกันมากนัก

การดำเนินการกับไฟล์เป็นจำนวนมากบนไดเร็กทอรีที่เมาท์ NFS ช้า หากคุณมีโอกาสที่จะเข้าสู่เซิร์ฟเวอร์ NFS ของตัวเองและทำมันในไดเรกทอรีจริงแล้วนี่จะเร็วขึ้น

ลองทดสอบโดยการลบคอลเลกชันพอร์ต OpenBSD ที่ฉันเช็คเอาต์จาก CVS และติดตั้งผ่าน NFS:

บนเซิร์ฟเวอร์ NFS:

$ cd /export/shared/ports

$ du -hs .
2.6G    .

$ find . | wc -l
  179688

$ time rm -rf /export/shared/ports/*
0m20.87s real     0m00.12s user     0m04.62s system

บนไคลเอนต์ (หลังจากเรียกคืนไฟล์ต้นฉบับจากการสำรองข้อมูล):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.