มันจะสร้างความแตกต่างในเวลาที่จะเข้าสู่ระบบในเครื่องที่มีไดเรกทอรีก่อนที่จะทำrm -rf
ในไดเรกทอรีหรือเพียงrm -rf
ไดเรกทอรีมากกว่า NFS?
มันจะสร้างความแตกต่างในเวลาที่จะเข้าสู่ระบบในเครื่องที่มีไดเรกทอรีก่อนที่จะทำrm -rf
ในไดเรกทอรีหรือเพียงrm -rf
ไดเรกทอรีมากกว่า NFS?
คำตอบ:
แน่นอน ssh ดีกว่า
Nfs ใช้โปรโตคอลเครือข่ายที่ซับซ้อนพร้อมการเรียกขั้นตอนระยะไกลที่หลากหลายและการประสานเวลารอข้อมูล ในกรณีของ ssh สิ่งเหล่านี้ใช้ไม่ได้
นอกจากนี้ยังมีล็อคจำนวนมาก การลบไฟล์ใน nfs ทำงานด้วยวิธีนี้:
rm
คำสั่งของคุณให้unlink()
syscallunlink()
โทรunlink()
โทรนี้ทางด้านระยะไกลunlink()
โทรเดิมของคุณrm
rm
วนซ้ำเป็นไฟล์ถัดไปข้ามไป 1ตอนนี้สิ่งสำคัญคือระหว่าง 2-7 rm
ต้องรอ มันสามารถส่งการunlink()
เรียกครั้งต่อไปแบบอะซิงโครนัส แต่เป็นเครื่องมือแบบเธรดเดียวไม่ใช่เหตุการณ์เชิง แม้ว่าจะทำได้ แต่ก็ยังต้องใช้แฟล็กเมาท์ nfs ที่ยุ่งยาก จนกว่าจะไม่ได้ผลลัพธ์ก็จะรอ
Nfs - และระบบไฟล์เครือข่ายใด ๆ - จะช้ากว่าเสมอ
ในหลายกรณีคุณสามารถทำการลบซ้ำด้วยความเร็วเสมือนจริงโดยใช้กลอุบาย:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)จากหลาย ๆ แง่มุม (แต่ไม่ใช่ทั้งหมด) การลบไดเรกทอรีนี้จะดูราวกับว่ามันเกิดขึ้นในเวลาจริง
ส่วนขยาย:ตามที่ @ el.pascado กล่าวถึงในความคิดเห็นที่ยอดเยี่ยมของเขาจริง ๆ แล้ว 2-7 ต้องเรียกใช้3xสำหรับไฟล์ใด ๆ :
lstat()
syscall)unlink()
ในกรณีของไดเรกทอรีopendir()
ลบไฟล์ทั้งหมดที่ไดเรกทอรี / ในนั้นซ้ำแล้วในที่สุดclosedir()
rmdir()
readdir()
โทรสิ่งนี้จำเป็นต้องใช้คำสั่ง 3 nfs RPC สำหรับไฟล์และอีก 3 คำสั่งสำหรับไดเรกทอรี
ใช่. อาจจะ มันขึ้นอยู่กับ. สำหรับไฟล์และไดเร็กตอรี่จำนวนน้อยมันไม่ได้แตกต่างกันมากนัก
การดำเนินการกับไฟล์เป็นจำนวนมากบนไดเร็กทอรีที่เมาท์ 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
-r
ธงrm
ต้องตรวจสอบก่อนว่าไฟล์เป็นไดเรกทอรี (lstat
ผ่าน NFS) เปิดมัน (opendir
ผ่าน NFS) อ่านเนื้อหา (readdir
ผ่าน NFS) และจากนั้นทำการลบจริงตามที่อธิบายไว้ในคำตอบในทุกไฟล์ที่พบภายในและ เรียกใช้ซ้ำในไดเรกทอรีย่อยปิดไดเรกทอรี (closedir
ผ่าน nfs) จากนั้นทำซ้ำสำหรับทุก dir ที่พบ