ฉันต้องกำจัดขีด จำกัด "ไฟล์ที่เปิดมากเกินไปในระบบ" ที่น่ารำคาญใน OS X 10.7.1
มีวิธีหรือไม่?
ฉันต้องกำจัดขีด จำกัด "ไฟล์ที่เปิดมากเกินไปในระบบ" ที่น่ารำคาญใน OS X 10.7.1
มีวิธีหรือไม่?
คำตอบ:
ตามบทความที่เป็นประโยชน์นี้ (ซึ่งฉันขอแนะนำให้อ่าน):
ตามค่าเริ่มต้นจำนวนไฟล์สูงสุดที่ Mac OS X สามารถเปิดได้คือ 12,288 และจำนวนไฟล์สูงสุดที่กระบวนการเปิดสามารถเปิดได้คือ 10,240
คุณสามารถตรวจสอบสิ่งเหล่านี้ด้วย:
sysctl kern.maxfiles
sysctl kern.maxfilesperproc
คุณสามารถเพิ่มขีด จำกัด (ด้วยความเสี่ยงของคุณเอง) ด้วย:
sysctl -w kern.maxfiles=20480
(หรือหมายเลขใดก็ได้ที่คุณเลือก)sysctl -w kern.maxfilesperproc=18000
(หรือหมายเลขใดก็ได้ที่คุณเลือก)หากต้องการทำการเปลี่ยนแปลงแบบถาวรให้ใช้sudo
การตั้งค่าของคุณ/etc/sysctl.conf
(ซึ่งคุณอาจต้องสร้าง) เช่นนี้:
kern.maxfiles=20480
kern.maxfilesperproc=18000
หมายเหตุ: ใน OS X 10.10 หรือต่ำกว่าคุณสามารถเพิ่มการตั้งค่า/etc/launchd.conf
เหมือนlimit maxfiles
และมันจะแทนที่สิ่งที่คุณใส่ที่นี่
อีกครั้งจากบทความ:
เมื่อคุณทำสิ่งนี้แล้วเคอร์เนลจะมีจำนวนไฟล์สูงสุด แต่เชลล์อาจไม่มี และเนื่องจากกระบวนการส่วนใหญ่ที่ใช้ไฟล์จำนวนมากนี้จะเริ่มต้นโดยเชลล์คุณจะต้องเพิ่มมัน
คำสั่งสำหรับสิ่งนั้นคือ:
ulimit -S -n 2048 # or whatever number you choose
การเปลี่ยนแปลงนั้นเป็นเพียงชั่วคราว มันจะคงอยู่สำหรับเซสชั่นเชลล์ปัจจุบันเท่านั้น คุณสามารถเพิ่มเข้าไปในไฟล์ของคุณกำหนดค่าเปลือก ( .bashrc
, .zshrc
หรืออะไรก็ตาม) ถ้าคุณต้องการให้ทำงานทุกครั้งที่เปิดเปลือก
kern.maxfiles=65000 kern.maxfilesperproc=65000
ใน / etc / sysctl.conf และรีบูต kern.maxfiles ถูกเพิกเฉยและคงค่าดีฟอลต์ไว้ แต่ kern.maxfilesperproc ถูกตั้งค่าไว้ที่ 65000 ฉันไม่มี /etc/launchd.conf ดังนั้นจึงเป็นเช่นนั้น
ดูเหมือนว่ามีวิธีการที่แตกต่างกันอย่างสิ้นเชิงสำหรับการเปลี่ยนการ จำกัด ไฟล์เปิดสำหรับ OS X แต่ละรุ่น!
สำหรับ OS X Sierra (10.12.X) คุณต้อง:
1.
สร้างไฟล์ที่/Library/LaunchDaemons/limit.maxfiles.plist
และวางต่อไปนี้ใน (อย่าลังเลที่จะเปลี่ยนตัวเลขสองตัว (ซึ่งเป็นขีด จำกัด ซอฟต์และฮาร์ดตามลำดับ):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
2. เปลี่ยนเจ้าของไฟล์ใหม่ของคุณ:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3. โหลดการตั้งค่าใหม่เหล่านี้:
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4. สุดท้ายตรวจสอบว่าขีด จำกัด นั้นถูกต้อง:
launchctl limit maxfiles
IO Error: Bad file descriptor (Write failed)
คุณจะต้องเพิ่มการตั้งค่า ulimit ของคุณ - มันค่อนข้างต่ำใน OS X วันนี้ - 256 โดยค่าเริ่มต้น เพิ่มulimit -n 4096
หรือคล้ายกับ ~ / .profile หรือเทียบเท่าของคุณและที่จะแก้ปัญหาได้ในสภาพแวดล้อมท้องถิ่นของคุณ เรียกใช้ulimit -a
เพื่อตรวจสอบระดับปัจจุบันของคุณ
หากต้องการดูการตั้งค่าระบบให้ทำดังนี้
launchctl limit maxfiles
มีการตั้งค่าค่อนข้างสูงใน Lion (10240) ในแต่ละกระบวนการมากกว่าที่เคยเป็น แต่ถ้าคุณยังคงกดปุ่มนั้นคุณสามารถตั้งค่ามันให้สูงขึ้นโดยใช้คำสั่งเดียวกันกับระดับที่ต้องการ เพื่อให้การเปลี่ยนแปลงอย่างถาวร / etc / launchd.conf เป็นที่ที่คุณต้องการเพิ่มบรรทัดที่เกี่ยวข้อง
ulimit -a
)
ตัวเลือกอื่นอาจค้นหาผู้กระทำผิด:
sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
สำหรับไฟล์ล่าสุดคุณจะเห็นไฟล์ที่เปิดอยู่:
sudo lsof -n | grep socketfil
และฆ่ากระบวนการถ้าต้องการ
kill $pid
จากความคิดเห็นที่:
สำหรับสิ่งที่คุ้มค่าคุณสามารถรับรายการ ID กระบวนการด้วยไฟล์ที่เปิดมากที่สุดโดยใช้
lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
-h
(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
-h
lsof -n +c 0
เพื่อป้องกันชื่อกระบวนการที่ถูกตัดทอน
คนบน Mavericks 10.9.4
ulimit -n 2048
ทำงานได้ดี คุณอาจต้องเปิดเซสชันการเข้าสู่ระบบใหม่
สำหรับ macOS ล่าสุด (ขณะเขียน: 10.14.1) คุณสามารถใช้sudo launchctl limit maxfiles 64000 524288
(โดยค่าเริ่มต้นคือ 256) แต่จะใช้ได้เฉพาะในเซสชันปัจจุบันเท่านั้น ใช้launchctl
งานจาก @ninjaPixel ( https://superuser.com/a/1171028/760235 ) สำหรับการแก้ปัญหาอย่างถาวร
คุณสามารถเรียกใช้
lsof -n
กระบวนการใดเปิดไฟล์จำนวนมากเกินไป
จากนั้นฆ่ามัน
หรือ
sysctl -w kern.maxfiles=20480
เปลี่ยนเป็นอันที่ใหญ่กว่า
หลังจากการเปลี่ยนแปลงทั้งหมดข้างต้น java ของฉันไม่ได้ทำมากกว่า 10,000 ไฟล์ โซลูชันคือแฟล็ก jvm นี้-XX: -MaxFDLimit
ฉันพบมันในขณะที่ทำ chmod -R ดังนั้นฉันจึงไปรอบ ๆ โดยทำตามขั้นตอนเล็ก ๆ เช่น
# for each directory
find . -type d -exec chmod 755 {} \;
คล้ายกับhttps://superuser.com/a/1171028/367819
หากต้องการตรวจสอบข้อ จำกัด ปัจจุบันของระบบ Mac OS X ให้เรียกใช้:
launchctl limit maxfiles
สองคอลัมน์สุดท้ายคือขีด จำกัด soft และ hard ตามลำดับ
หากต้องการปรับขีด จำกัด การเปิดไฟล์ตามระบบทั้งระบบใน Mac OS X Yosemite คุณต้องสร้างไฟล์กำหนดค่าสองไฟล์ อย่างแรกคือไฟล์รายการคุณสมบัติ (aka plist) ใน /Library/LaunchDaemons/limit.maxfiles.plist ที่มีการกำหนดค่า XML ต่อไปนี้:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>200000</string>
<string>200000</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
สิ่งนี้จะตั้งค่าขีด จำกัด ของ open files เป็น 200000 ไฟล์การกำหนดค่า plist ที่สองควรถูกเก็บไว้ใน /Library/LaunchDaemons/limit.maxproc.plist ด้วยเนื้อหาต่อไปนี้:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
ไฟล์ plist ทั้งสองจะต้องเป็นเจ้าของโดย root: wheel และมีสิทธิ์ -rw-r - r-- การอนุญาตนี้ควรจะอยู่ในสถานที่โดยค่าเริ่มต้น แต่คุณสามารถมั่นใจได้ว่าพวกเขาอยู่ในสถานที่โดยการเรียกใช้ sudo chmod 644 แม้ว่าขั้นตอนที่อธิบายไว้ข้างต้นจะทำให้การตั้งค่าขีด จำกัด การเปิดไฟล์ทั่วทั้งระบบถูกต้องเมื่อเริ่มต้นใหม่ แต่คุณสามารถปรับใช้ด้วยตนเองโดยเรียกใช้ขีด จำกัด ของ Launchctl
นอกเหนือจากการตั้งค่าขีด จำกัด เหล่านี้ที่ระดับระบบเราขอแนะนำให้ตั้งค่าที่ระดับเซสชันด้วยการผนวกบรรทัดต่อไปนี้ไปยังไฟล์ bashrc, bashprofile หรืออนาล็อกของคุณ:
ulimit -n 200000
ulimit -u 2048
เช่นเดียวกับไฟล์ plist ไฟล์ bashrc หรือไฟล์ที่คล้ายกันของคุณควรมีสิทธิ์ -rw-r - r-- ณ จุดนี้คุณสามารถรีสตาร์ทคอมพิวเตอร์และป้อน ulimit -n ในเทอร์มินัลของคุณ หากระบบของคุณได้รับการกำหนดค่าอย่างถูกต้องคุณควรเห็นว่า maxfiles นั้นถูกตั้งค่าเป็น 200000
คุณสามารถติดตามบทความนี้สำหรับรายละเอียดเพิ่มเติม
https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c
อย่าลืมรีสตาร์ท Mac ของคุณเพื่อให้ค่ามีประสิทธิภาพ