มีการแก้ไขข้อผิดพลาด“ มีไฟล์เปิดมากเกินไปในระบบ” ใน OS X 10.7.1 หรือไม่


191

ฉันต้องกำจัดขีด จำกัด "ไฟล์ที่เปิดมากเกินไปในระบบ" ที่น่ารำคาญใน OS X 10.7.1 

มีวิธีหรือไม่?


4
คุณต้องการอธิบายเพิ่มเติมเกี่ยวกับเหตุการณ์นี้เมื่อใด ในสถานการณ์ใด
slhck

1
@slhck - ฉันมีปัญหาเดียวกัน โดยทั่วไปสถานการณ์จะ "สุ่ม" ฉันเป็นนักพัฒนาซอฟต์แวร์ดังนั้นฉันจึงใช้งาน Mac เป็นอย่างมาก: ใช้ฐานข้อมูลอย่างน้อยหนึ่งเว็บเซิร์ฟเวอร์เครื่องมือทดสอบเบราว์เซอร์หนึ่งรายการขึ้นไปและเครื่องเล่นเพลงพร้อมกัน Google Chrome ดูเหมือนจะเป็นโปรแกรมหนึ่งที่มีไฟล์จำนวนมากเปิดอยู่
Nathan Long

ที่จริงแล้ว "การใช้งานหนัก" ของฉันไม่ใช่ปัญหา การตั้งค่าของฉันสำหรับจำนวนไฟล์ที่เปิดสูงสุดสำหรับ kernal และต่อกระบวนการต่ำกว่าค่าเริ่มต้นที่ควรเป็น
Nathan Long

2
หากคุณอ่านความคิดเห็นของนาธานและสงสัยว่าทำไมเขาไม่รวมรายละเอียดใด ๆ เกี่ยวกับค่าเริ่มต้นนั่นเป็นเพราะเขาสะกดทุกคำตอบของเขาด้านล่าง (คำตอบที่ดี! :)
Olie

ฉันอยู่ในสภาพการใช้งานเช่นเดียวกับ Nathan Long และพบว่าการรีสตาร์ท Apache เป็นขั้นตอนเดียวที่ "แก้ไข" ปัญหา ฉันใช้ขีด จำกัด ด้านล่างทั้งหมดเพิ่มขึ้น แต่พวกเขาไม่ได้ช่วยทันที ฉันใช้คำสั่ง phpUnit การทดสอบ> เซิร์ฟเวอร์ซีลีเนียม> firefox> apache> php> mysql ทั้งหมดใน macbook เดียวกัน ใช้ในการทำงานได้ดีจนกระทั่งฉันอัพเกรดเป็น mavericks ข้อผิดพลาดที่ฉันได้รับอยู่ในการทดสอบ webapp นั่นคือ php / apache ไม่มีไฟล์ดังนั้นจึงไม่สามารถควบคุมได้โดยการตั้งค่าเชลล์
scipilot

คำตอบ:


225

ตามบทความที่เป็นประโยชน์นี้ (ซึ่งฉันขอแนะนำให้อ่าน):

ตามค่าเริ่มต้นจำนวนไฟล์สูงสุดที่ 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หรืออะไรก็ตาม) ถ้าคุณต้องการให้ทำงานทุกครั้งที่เปิดเปลือก


1
ข้อ จำกัด ใดที่นำไปใช้กับกระบวนการที่เรียกใช้โดยการคลิกไอคอนในพื้นที่การเรียกใช้ และวิธีการเปลี่ยนขีด จำกัด นั้น? เมื่อคุณพูดว่า "shell" ฉันถือว่าคุณหมายถึงเชลล์เทอร์มินัลแบบโต้ตอบ
Cheeso

@Cheeso - ฉันคิดว่าขีด จำกัด ของระบบโดยรวม (sysctl) หรือขีด จำกัด ของ launchd แล้วแต่จำนวนใดจะต่ำกว่าควบคุมว่า
Nathan Long

1
การสร้าง /etc/launchd.conf ด้วยขีด จำกัด ของเนื้อหาสูงสุด 1000000 1000000 ทำงานได้ดีสำหรับฉัน! (OSX 10.8.2 ที่นี่)
Zugwalt

1
ฉันใส่kern.maxfiles=65000 kern.maxfilesperproc=65000ใน / etc / sysctl.conf และรีบูต kern.maxfiles ถูกเพิกเฉยและคงค่าดีฟอลต์ไว้ แต่ kern.maxfilesperproc ถูกตั้งค่าไว้ที่ 65000 ฉันไม่มี /etc/launchd.conf ดังนั้นจึงเป็นเช่นนั้น
pferrel

2
หากใครมีปัญหาเกี่ยวกับไฟล์สูงสุดที่ไม่ได้ติดอยู่อาจเป็นเพราะมีช่องว่างต่อท้ายหลังจากบรรทัด maxfiles ซึ่งจำเป็นต้องลบทิ้ง
jjathman

62

ดูเหมือนว่ามีวิธีการที่แตกต่างกันอย่างสิ้นเชิงสำหรับการเปลี่ยนการ จำกัด ไฟล์เปิดสำหรับ 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)
agradl

1
ใช้ได้กับ El Capitan 10.11.6
ทรอยแดเนียลส์

ยังไม่สามารถเปลี่ยน ulimit สำหรับเชลล์ได้ จำนวนการเข้าชมสูงสุด 1024 สิ่งที่ฉันทำ
DataGreed

ในขั้นตอนที่ 2 ทำงาน: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

32

คุณจะต้องเพิ่มการตั้งค่า ulimit ของคุณ - มันค่อนข้างต่ำใน OS X วันนี้ - 256 โดยค่าเริ่มต้น เพิ่มulimit -n 4096หรือคล้ายกับ ~ / .profile หรือเทียบเท่าของคุณและที่จะแก้ปัญหาได้ในสภาพแวดล้อมท้องถิ่นของคุณ เรียกใช้ulimit -aเพื่อตรวจสอบระดับปัจจุบันของคุณ

หากต้องการดูการตั้งค่าระบบให้ทำดังนี้

launchctl limit maxfiles

มีการตั้งค่าค่อนข้างสูงใน Lion (10240) ในแต่ละกระบวนการมากกว่าที่เคยเป็น แต่ถ้าคุณยังคงกดปุ่มนั้นคุณสามารถตั้งค่ามันให้สูงขึ้นโดยใช้คำสั่งเดียวกันกับระดับที่ต้องการ เพื่อให้การเปลี่ยนแปลงอย่างถาวร / etc / launchd.conf เป็นที่ที่คุณต้องการเพิ่มบรรทัดที่เกี่ยวข้อง


1
256? มันเป็นตัวอธิบายไฟล์ 2560 ตัวสำหรับฉันและฉันไม่เคยเปลี่ยนเลย ขีด จำกัด คือกระบวนการ 266 (cf ulimit -a)
slhck

2
สำหรับฉันเหมือนกัน 256 ไฟล์บน MacOS X Maverick
Climbatize

4
256 บน OS X Yosemite เช่นกัน
Alexander

2
256 บน El Capitan เช่นกัน
TMN

1
256 ในโยเซมิตี
Jaec

31

ตัวเลือกอื่นอาจค้นหาผู้กระทำผิด:

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

ที่เป็นประโยชน์! แต่การจัดเรียงบน OS X (10.11) ไม่ได้ใช้ -h (อาจจะ -g?)
Robert Calhoun

สำหรับฉันทำงานได้ดีโดยไม่ต้องใช้-h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

ดังนั้นไม่ว่าจะเป็น-h
sanmai

นี่เป็นคำตอบเดียวที่ช่วยให้ฉันรูทปัญหาของฉัน .. ขอบคุณ :)
SgtPooki

1
ใช้lsof -n +c 0เพื่อป้องกันชื่อกระบวนการที่ถูกตัดทอน
วอห์น

9

คนบน Mavericks 10.9.4

ulimit -n 2048ทำงานได้ดี คุณอาจต้องเปิดเซสชันการเข้าสู่ระบบใหม่


2

สำหรับ macOS ล่าสุด (ขณะเขียน: 10.14.1) คุณสามารถใช้sudo launchctl limit maxfiles 64000 524288(โดยค่าเริ่มต้นคือ 256) แต่จะใช้ได้เฉพาะในเซสชันปัจจุบันเท่านั้น ใช้launchctlงานจาก @ninjaPixel ( https://superuser.com/a/1171028/760235 ) สำหรับการแก้ปัญหาอย่างถาวร


คุณคิดเลข 524288 ขึ้นมาได้อย่างไร? ค่าก่อนหน้าของฉันคือ 256 และไม่ จำกัด
Chip Roberson

1

คุณสามารถเรียกใช้

lsof -n

กระบวนการใดเปิดไฟล์จำนวนมากเกินไป

จากนั้นฆ่ามัน

หรือ

sysctl -w kern.maxfiles=20480

เปลี่ยนเป็นอันที่ใหญ่กว่า


3
โปรดอธิบายว่าคำตอบนี้แตกต่างจากคำตอบที่ได้รับไปแล้ว
Stephen Rauch

1

หลังจากการเปลี่ยนแปลงทั้งหมดข้างต้น java ของฉันไม่ได้ทำมากกว่า 10,000 ไฟล์ โซลูชันคือแฟล็ก jvm นี้-XX: -MaxFDLimit


0

ฉันพบมันในขณะที่ทำ chmod -R ดังนั้นฉันจึงไปรอบ ๆ โดยทำตามขั้นตอนเล็ก ๆ เช่น

# for each directory
find . -type d -exec chmod 755 {} \;

1
แม้ว่านี่อาจจะเป็นการแก้ปัญหา แต่ก็ไม่ได้ตอบคำถาม บางทีอธิบายว่าคุณไม่สามารถกำจัดข้อความแล้วเสนอเป็นวิธีหนึ่งที่จะทำให้ปัญหาน้อยลงจะช่วยปรับปรุงคำตอบของคุณ
music2myear

0

คล้ายกับ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 ของคุณเพื่อให้ค่ามีประสิทธิภาพ


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