คำสั่งใดควบคุมการเปิดไฟล์


19

ไฟล์คำสั่ง / การกำหนดค่าใดควบคุมการเปิดไฟล์ จำกัด บน OS X มีคำสั่งต่าง ๆ สำหรับ OS X 10.5 / 10.6 / 10.7 หรือไม่ ตัวเลือกที่ผมสำรวจด้านล่างนี้มีulimit, sysctlและlaunchctl

"เห็นได้ชัดว่ามีไฟล์เปิดมากเกินไป" เป็นข้อผิดพลาดทั่วไปของ Leopard บางทีอาจเป็น OS X รุ่นอื่น:

มีหลายวิธี (ที่เกี่ยวข้อง?) เพื่อดูข้อ จำกัด ของไฟล์ที่เปิดอยู่:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

มีการอ้างสิทธิ์ในโพสต์ด้านบนบางรายการที่สามารถแก้ไขได้ด้วยคำสั่งต่อไปนี้:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

อย่างไรก็ตามจากคำสั่งข้างต้นเฉพาะคำสั่งเท่านั้นที่sysctlมีผลกระทบที่ชัดเจน (เช่นulimit -nและlaunchctl limitไม่แสดงการเปลี่ยนแปลงหลังจากป้อนคำสั่งข้างต้นแล้วในขณะที่sysctl -aแสดงการเปลี่ยนแปลงที่ร้องขอ)

ตำแหน่งที่สอดคล้องกันเพื่อเปลี่ยนพารามิเตอร์เหล่านี้สำหรับระบบปฏิบัติการ ได้แก่ :

/etc/sysctl.conf
/etc/launchd.conf

ฉันยังค้นพบคำตอบเดียวที่อ่านว่าulimitควบคุมเชลล์ปัจจุบันเท่านั้น

ฉันจะปรับขีด จำกัดสูงสุดของไฟล์สูงสุด / ไฟล์สูงสุดที่เปิดได้บน macOS ได้อย่างไร

คำตอบ:


9

คำตอบง่ายๆที่เคยมีคือมีหลายขีด จำกัด และขีด จำกัด ต่ำสุดที่คุณเข้าถึงในอินสแตนซ์เฉพาะจะสร้างข้อผิดพลาดของคุณ ตอนนี้ใน 10.12 launchctl limit maxfilesยังอยู่ในการผสม สำหรับรายละเอียดเกี่ยวกับการใช้งานคำตอบที่ยอดเยี่ยมนี้คือการได้รับรางวัลและสมควรได้รับคะแนนเสียงมากกว่าที่ฉันจะให้

หัวข้อที่เกี่ยวข้องอื่น ๆ คือ:

ulimitระดับตั้งค่าต่ำเพื่อป้องกันไม่ให้เชลล์สคริปต์หนึ่งยากจนจากน้ำท่วมเคอร์เนลที่มีไฟล์ที่เปิด

นี่kern.maxfilesperprocคือการออกจากห้องเล็ก ๆ ในจำนวนไฟล์สูงสุดเพื่อให้กระบวนการหนึ่งสามารถใช้งานได้มากที่สุด แต่ไม่ใช่พื้นที่จัดการไฟล์เปิดทั้งหมดจากเคอร์เนล

สำหรับสถานการณ์ปกตินั้นkern.maxfilesเป็นปัจจัย จำกัด ขั้นสุดท้าย

ใน Sierra - ขีด จำกัด คือ 256 ไฟล์ที่เปิดและไม่ จำกัด จำนวนสูงสุดดังนั้นฉันจึงพบว่ามีไฟล์ 3 ถึง 4 พันไฟล์ที่ตั้งไว้สำหรับขีด จำกัด ซอฟต์ที่ใช้งานได้กับฮาร์ดแวร์ทั้งหมดของเราและยังคงรักษาระบบไว้ ไฟล์ เราต้องการให้เซิร์ฟเวอร์การพัฒนาของเราอยู่ในระดับ 256 ขีด จำกัด เพื่อให้เราตรวจจับซอฟต์แวร์ที่รั่วและมีปัญหาในการพัฒนา / จัดเตรียมและทดสอบแทนที่จะค้นหาข้อมูลเกี่ยวกับเซิร์ฟเวอร์ในการผลิต

ฉันไม่ได้เป็นแฟนของไฟล์ 10k - อาจจะมี APFS และที่เก็บ NVMe เราจะเห็นวันที่ไม่คิดไม่ถึง แต่พยายามติดกับหลายร้อยหรือน้อยพันสำหรับการ จำกัด ไฟล์ของคุณ โดยเฉพาะอย่างยิ่งหาก mac ของคุณมีการจำกัด กระบวนการในระดับต่ำการเปิดไฟล์จำนวนมากโดยกระบวนการบางอย่างอาจเป็นปัญหาได้


9

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

ฉันดูเหมือนจะมีปัญหาในการตั้งค่า maxfiles เป็นไม่ จำกัด ด้วยวิธีนี้โดยการตั้งค่าที่สองเป็น 'ไม่ จำกัด ' ความคิดใด ๆ
user200857

7

ต่อไปนี้ควรแก้ไขปัญหาที่พบบ่อยที่สุด (และมีการระบุไว้ในลำดับชั้นของพวกเขา):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

หมายเหตุ:

  1. คุณจะต้องรีสตาร์ทเพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล
  2. AFAIK คุณไม่สามารถตั้งค่า จำกัด เป็น 'ไม่ จำกัด ' ภายใต้ OS X ได้อีก
  3. launchctl maxfiles ถูกล้อมรอบด้วย sysctl maxfiles และดังนั้นจึงไม่สามารถเกินได้
  4. sysctl ดูเหมือนจะสืบทอด kern.maxfilesperproc จาก launchctl maxfiles
  5. ulimit ดูเหมือนจะรับช่วงเป็นค่า 'เปิดไฟล์' จาก launchctl ตามค่าเริ่มต้น
  6. คุณสามารถตั้งค่า ulimit ที่กำหนดเองได้ภายใน / etc / profile หรือ ~ / .profile; ในขณะนี้ไม่จำเป็นต้องฉันได้ให้ตัวอย่าง
  7. ระมัดระวังเมื่อตั้งค่าใด ๆ เหล่านี้เป็นจำนวนที่สูงมากเมื่อเทียบกับค่าเริ่มต้น - คุณลักษณะที่มีความเสถียร / ความปลอดภัย ฉันนำตัวเลขตัวอย่างเหล่านี้ซึ่งฉันเชื่อว่ามีเหตุผลเขียนบนเว็บไซต์อื่น ๆ

0

ในคำง่าย ๆ :

  • ulimitคำสั่งให้ "ควบคุมทรัพยากรที่มีให้เปลือกและกระบวนการสร้าง" (ดู: help ulimitและman bash) ทรัพยากรที่กำหนดให้กับเชลล์ถูก จำกัด โดยข้อ จำกัด ของทรัพยากรระบบ

  • การlaunchctlควบคุมการใช้ทรัพยากรระบบสูงสุดโดยกระบวนการปัจจุบัน (ดู: man setrlimitและman launchctl) ค่าสูงสุดถูก จำกัด โดยข้อ จำกัด เคอร์เนล

  • การsysctlควบคุมข้อ จำกัด เคอร์เนล (ดู: man sysctlและจำกัด การปรับแต่งเคอร์เนลของ BSD )

ในการเพิ่มขีด จำกัด คุณสามารถใช้คำสั่งแต่ละคำสั่งขึ้นอยู่กับปัญหา

ดูเพิ่มเติม: อะไรคือความสัมพันธ์ระหว่าง "launchctl limit" และ "ulimit"


สำหรับปัญหาของไฟล์ที่เปิดมากเกินไปขึ้นอยู่กับข้อ จำกัด ของ soft หรือ hard (ไม่ว่าจะเป็นสคริปต์เชลล์แบบโลคอลสคริปต์ทั่วโลกที่รันโดยrootแอพหรือกระบวนการทั้งหมดในเวลาเดียวกัน) มันมีค่าที่จะเพิ่มขีด จำกัด ทั้งหมด (ข้อ จำกัด เปลือก, launchdและเคอร์เนล)

ในการเพิ่มขีด จำกัด อย่างต่อเนื่องโปรดดู: วิธีควบคุมปริมาณการใช้ทรัพยากรระบบสูงสุดอย่างต่อเนื่องบน Mac

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