มันจะสร้างความแตกต่างในเวลาที่จะเข้าสู่ระบบในเครื่องที่มีไดเรกทอรีก่อนที่จะทำrm -rfในไดเรกทอรีหรือเพียงrm -rfไดเรกทอรีมากกว่า NFS?
มันจะสร้างความแตกต่างในเวลาที่จะเข้าสู่ระบบในเครื่องที่มีไดเรกทอรีก่อนที่จะทำrm -rfในไดเรกทอรีหรือเพียงrm -rfไดเรกทอรีมากกว่า NFS?
คำตอบ:
แน่นอน ssh ดีกว่า
Nfs ใช้โปรโตคอลเครือข่ายที่ซับซ้อนพร้อมการเรียกขั้นตอนระยะไกลที่หลากหลายและการประสานเวลารอข้อมูล ในกรณีของ ssh สิ่งเหล่านี้ใช้ไม่ได้
นอกจากนี้ยังมีล็อคจำนวนมาก การลบไฟล์ใน nfs ทำงานด้วยวิธีนี้:
rmคำสั่งของคุณให้unlink()syscallunlink()โทรunlink()โทรนี้ทางด้านระยะไกลunlink()โทรเดิมของคุณrmrm วนซ้ำเป็นไฟล์ถัดไปข้ามไป 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 ที่พบ