ทางเลือกที่ไม่ใช้ CPU สูงเพื่อ lsof?


12

เราเรียกใช้คลัสเตอร์Apache Cassandraที่แต่ละโฮสต์มีไฟล์เปิดสองสามแสนไฟล์ในเวลาใดก็ตาม

เราต้องการที่จะได้รับจำนวนไฟล์ที่เปิดตามช่วงเวลาและป้อนตัวเลขนี้เป็นแกรไฟต์แต่เมื่อเราทำงานlsofภายใต้collectdมันจะใช้เวลาไม่กี่นาทีเพื่อให้เสร็จสมบูรณ์และเคี้ยวซีพียูจำนวนมากในระหว่างนี้ .

ฉันสงสัยว่ามีวิธีอื่นและเป็นมิตรมากกว่านี้ในการรับข้อมูลเดียวกันที่ lsof ให้ไว้หรือแม้กระทั่งวิธีการใช้ lsof ที่จะไม่กินลงใน CPU อย่างเห็นได้ชัดหรือไม่? (แม้ว่าฉันคิดว่าวิธีหลังนี้น่าจะใช้เวลานานกว่าจะเสร็จสมบูรณ์กว่าที่เป็นอยู่ในปัจจุบัน ... ไม่เหมาะ)

บางทีเคอร์เนลรักษาตัวแปรบางแห่งที่มีจำนวนไฟล์ที่เปิดอยู่? คิดอย่างปรารถนา?

ปรับปรุง:

ในการตอบสนองต่อคำตอบอย่างใดอย่างหนึ่งเรากำลังใช้-bและตั้ง-nค่าสถานะแล้ว นี่คือคำสั่งทั้งหมดที่ฉันใช้ภายใต้collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

คำตอบ:


12

คุณอาจไม่จำเป็นต้องแก้ไขที่อยู่เครือข่ายสำหรับซ็อกเก็ตดังนั้นอย่างน้อยใช้-nสวิตช์ -bแล้วคุณอาจต้องการเพื่อให้การดำเนินการปิดกั้นข้ามกับ

สวิตช์แรก 2 ตัวนี้ควรทำให้เร็วขึ้นจริงๆ

จากนั้น-lเพื่อหลีกเลี่ยงการแก้ไข uids และ-Lเพื่อหลีกเลี่ยงการนับลิงค์ ฯลฯ เห็นคน lsof

อีกทางหนึ่งด้วย Linux คุณสามารถสร้างสคริปต์เพื่อนับจำนวนลิงก์ภายใต้/proc/<PID>/fdสิ่งนี้:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


ฉันได้รับเสมอ - ค้นหา: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': ไม่มีไฟล์หรือไดเรกทอรี - Q @ Beno Bent ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร
BG Bruno

2
@BrunoBG: ลอง:echo /proc/*/fd/* | wc -w
Olivier Dulac

ขอบคุณ @OlivierDulac นั่นเป็นสิ่งที่ชัดเจน :-)
BG Bruno

คำแนะนำที่ดี แต่ใช้ตัวเลือก -n และ -b แล้ว .... ฉันต้องการคำแนะนำเพิ่มเติม
Michael Martinez

1
@OlivierDulac อาจไม่ทำงานหากคุณมี fd จำนวนมาก
Benoît

5

คุณทำผิด

จาก man proc

   /proc/sys/fs/file-nr

ไฟล์ (อ่านอย่างเดียว) นี้มีสามตัวเลข: จำนวนการจัดการไฟล์ที่จัดสรร (เช่นจำนวนไฟล์ที่เปิดในปัจจุบัน); จำนวนการจัดการไฟล์ฟรี และจำนวนสูงสุดของการจัดการไฟล์ (เช่นค่าเดียวกันกับ / proc / sys / fs / file-max) หากจำนวนของการจัดการไฟล์ที่จัดสรรใกล้เคียงกับค่าสูงสุดคุณควรพิจารณาเพิ่มจำนวนสูงสุด ก่อน Linux 2.6 เคอร์เนลที่จัดสรรไฟล์จะจัดการแบบไดนามิก แต่จะไม่ปล่อยให้ว่างอีกครั้ง แต่ตัวจัดการไฟล์อิสระถูกเก็บไว้ในรายการเพื่อทำการจัดสรรใหม่ ค่า "การจัดการไฟล์ฟรี" ระบุขนาดของรายการนั้น การจัดการไฟล์ฟรีจำนวนมากบ่งชี้ว่ามีการใช้งานสูงสุดในอดีตในการใช้งานการจัดการไฟล์ที่เปิด เนื่องจาก Linux 2.6 เคอร์เนลจะยกเลิกการจัดสรรไฟล์ที่จัดการอิสระและ "

ค่าแรกถ้าคุณแมวที่ให้คุณได้อย่างแม่นยำในสิ่งที่คุณจะปรากฏ

สำหรับเร็กคอร์ดที่ฉันไม่สามารถlsofเอาท์พุทให้ตรงกับมันแม้จะมีจำนวน fudging บางส่วน แต่ฉันรวบรวมถ้านั่นคือสิ่งที่เคอร์เนลบอกว่ามันมีอำนาจมากกว่ารายการที่คุณได้รับจากlsofนั้น


1
นี่คือการส่งออก lsof [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065ฉัน: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428นี่คือสิ่งที่ไฟล์ไม่มีพูดว่า: ความแตกต่างที่มีขนาดใหญ่ (1,000,000+ กับ 2784) เป็นเพราะความจริงที่ว่าlsofมีทุกสิ่งที่ไม่มีไฟล์อธิบายที่เกี่ยวข้อง: ไฟล์ไลบรารี, excecutables ฯลฯ ดังนั้นหากคุณสนใจเพียงอธิบายไฟล์แล้วfile-nrเป็นวิธีที่จะไปมิฉะนั้นคุณต้องการ lsof หรือเทียบเท่า
Michael Martinez

ลองinode-nrแทนในตำแหน่งเดียวกันแล้ว
Matthew Ife
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.