การระบุค่าเริ่มต้นของ ulimits บน OS X (10.5) อยู่ที่ไหน?


26

วันนี้nofileขีด จำกัดเริ่มต้นสำหรับบัญชีผู้ใช้ OS X น่าจะเป็นตัวบอกเกี่ยวกับไฟล์ประมาณ 256 ตัว ฉันพยายามทดสอบซอฟต์แวร์ที่ต้องการการเชื่อมต่อมากกว่าที่เปิดในครั้งเดียว

ในกล่อง Debian ทั่วไปที่ใช้โมดูล จำกัด pam ฉันจะแก้ไข/etc/security/limits.confเพื่อตั้งค่าขีด จำกัด ที่สูงขึ้นสำหรับผู้ใช้ที่จะใช้งานซอฟต์แวร์ แต่ฉันประหลาดใจที่จะตั้งค่าขีด จำกัด เหล่านี้ใน OS X

มี GUI อยู่หรือเปล่า? มีไฟล์ปรับแต่งอยู่หรือเปล่า? วิธีที่ฉลาดที่สุดในการเปลี่ยน ulimits เริ่มต้นบน OS X คืออะไร


สำหรับ Mac OS X Lion ดูsuperuser.com/questions/396102/ulimit-does-not-obey-me
David J.

คำตอบ:


27

launchdภายใต้เสือดาวกระบวนการแรกคือ ulimits launchdเริ่มต้นของแต่ละขั้นตอนได้รับมาจาก สำหรับการอ้างอิงข้อ จำกัด เริ่มต้น (รวบรวม) เป็น

$ sudo launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        6291456        unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     266            532            
    maxfiles    256            unlimited

หากต้องการเปลี่ยนข้อ จำกัด เหล่านี้ให้เพิ่มบรรทัด (คุณอาจต้องสร้างไฟล์ก่อน) /etc/launchd.confเป็นอาร์กิวเมนต์จะเหมือนกับที่ส่งผ่านไปยังlaunchctlคำสั่ง ตัวอย่างเช่น

echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf

อย่างไรก็ตามlaunchdได้เริ่มต้นเชลล์ล็อกอินของคุณแล้วดังนั้นวิธีที่ง่ายที่สุดในการเปลี่ยนแปลงเหล่านี้จะมีผลคือรีสตาร์ทเครื่องของเรา (ใช้ >> เพื่อผนวกเข้ากับ /etc/launchd.conf)


2
คุณสามารถเพิ่มลิงค์ลงในเอกสารประกอบอย่างเป็นทางการได้หรือไม่?
Glyph

7
เพื่อนถ้าเอกสารนี้ถูกบันทึกไว้ที่ใดก็ไม่จำเป็นต้องใช้หน้านี้
Dave Cheney

1
ดูเหมือนจะไม่ทำงานกับ Snow Leopard
ismail

1
ความคิดใดที่แตกต่างจากนี้sysctl.maxfiles? (คำถามที่เกี่ยวข้อง: apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
การแก้ไขechoเล็กน้อย: คุณกำลังทำงานภายใต้ sudo แต่พยายามให้เชลล์ที่ไม่ได้รับสิทธิพิเศษผนวกเข้ากับไฟล์ซึ่งมันไม่ได้รับอนุญาตให้ทำ ลองecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.confแทน
Vineet

4
sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

ไม่ทำงานเพราะ sudo อยู่ผิดที่ลองนี้:

echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf

3
นี่อาจจะดีกว่าในฐานะ "การแก้ไขที่แนะนำ" สำหรับคำตอบที่คุณอ้างอิง
Chris Johnsen

3

ข้อ จำกัด ของเชลล์

ทรัพยากรที่มีอยู่กับเปลือกและกระบวนการสามารถเปลี่ยนแปลงได้โดยulimitคำสั่งที่สามารถเพิ่มสคริปต์การเริ่มต้นเช่น~/.bashrcหรือ~/.bash_profileสำหรับผู้ใช้แต่ละคนหรือสำหรับผู้ใช้ทั้งหมด/etc/bashrc ตัวอย่างบรรทัดที่จะเพิ่ม:

ulimit -Sn 4096 && ulimit -Sl unlimited

ดู: help ulimitและman bashสำหรับข้อมูลเพิ่มเติม

ขีด จำกัด ของระบบ

โดยทั่วไปข้อ จำกัด ของระบบควบคุมโดยเฟรมเวิร์กLaunchdและสามารถเปลี่ยนแปลงได้โดยlaunchctlคำสั่งเช่น

launchctl limit maxfiles 10240 unlimited

ในการเปลี่ยนแปลงอย่างต่อเนื่องคุณจะต้องสร้างไฟล์รายการคุณสมบัติในโฟลเดอร์ที่เข้ากันได้กับ Launchซึ่งจะทำหน้าที่เป็นเอเจนต์เริ่มต้น

นี่คือคำสั่งตัวอย่างที่สร้างไฟล์เริ่มต้นดังกล่าว:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

อย่างไรก็ตามไฟล์จะถูกโหลดเมื่อมีการเปิดตัวระบบเพื่อทำการโหลดด้วยตนเอง:

sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist

เพื่อตรวจสอบข้อ จำกัด launchctl limitในปัจจุบันทำงาน:

โปรดดู: การสร้าง Daemons และ Agent ที่เปิดใช้งาน

ขีด จำกัด เคอร์เนล

  • ขีด จำกัด เคอร์เนลถูกควบคุมโดยsysctlคำสั่ง
  • หากต้องการดูข้อ จำกัด เคอร์เนลปัจจุบันให้รัน: sysctl -a | grep ^kern.max.
  • sudo sysctl -w kern.maxfiles=20480ในการเปลี่ยนสูงสุดของไฟล์ได้รับอนุญาตให้เปิดการทำงาน:
  • เพื่อทำการเปลี่ยนแปลงแบบถาวรให้ใช้วิธีการข้างต้นที่คล้ายกันเพื่อสร้างไฟล์รายการคุณสมบัติในโฟลเดอร์เริ่มต้นระบบ

ที่เกี่ยวข้อง:


วิธีการเลิก

ใน macOS รุ่นก่อนหน้าคุณสามารถตั้งค่าขีด จำกัด เหล่านี้ได้ทั้ง/etc/sysctl.confระบบตามปกติที่คุณทำบน Unix อย่างไรก็ตามดูเหมือนว่าไม่รองรับ

การใช้~/.launchd.confหรือ/etc/launchd.confปรากฏว่า macOS รุ่นที่มีอยู่ยังไม่รองรับ วิกิพีเดีย

เช่นเดียวกับ/etc/rc.localไฟล์เริ่มต้นไม่รองรับใน macOS


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

ตอนนี้ฉันต้องค้นหาสาเหตุที่มีอยู่ 2 วิธีในการตรวจสอบ / จำกัด การตั้งค่า ....


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


โอเคฉันเริ่มเข้าใจแล้ว ในฐานะของ v10.4 ไม่มีinitกระบวนการอีกต่อไปมันถูกแทนที่ด้วยlaunchdซึ่งทำงานด้วย PID 1

% ps -fu root
  UID   PID  PPID   C     STIME TTY           TIME CMD
    0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd

และแน่นอนว่ามูลค่าการกล่าวขวัญก็ulimitคือเชลล์ในตัวlaunchctlเป็นโปรแกรมเชลล์อิสระ


2

บน OS X หากคุณพยายามแก้ไขขีด จำกัด ซอฟต์สำหรับ daemon หรือกระบวนการหรืองานวิธีที่ถูกต้องในการเปลี่ยนข้อ จำกัด ซอฟต์แวร์เหล่านี้ไม่ได้เกิดจากการเปลี่ยนการกำหนดค่าเริ่มต้นสำหรับทุกกระบวนการ แต่โดยการตั้งค่าสำหรับกระบวนการที่คุณ พยายามเรียกใช้

สามารถทำได้ในไฟล์ launchd .plist สำหรับกระบวนการของคุณ

หากคุณมี daemon หรือกระบวนการที่ต้องเปิดไฟล์เพิ่มเติมให้สร้างไฟล์ plist สำหรับมันและเพิ่ม params เหล่านี้ลงไป:

    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
    </dict>

ตัวอย่างการใช้ mongodb ฉันสร้างไฟล์. plist ชื่อ org.mongo.mongodb.plist และบันทึกลงใน /Library/LaunchDaemons/org.mongo.mongodb.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>Disabled</key>
  <false/>
  <key>Label</key>
  <string>org.mongo.mongod</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/lib/mongodb/bin/mongod</string>
    <string>--dbpath</string>
    <string>/Users/Shared/mongodata/</string>
    <string>--logpath</string>
    <string>/var/log/mongodb.log</string>
  </array>
  <key>QueueDirectories</key>
  <array/>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>daemon</string>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
    <key>NumberOfProcesses</key>
    <integer>512</integer>
  </dict>
</dict>
</plist>

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

sudo launchctl load /Library/LaunchDaemons/org.mongod.plist

หากกระบวนการหรืองานของคุณมีเอเจนต์มากกว่า daemon คุณสามารถใส่. plist ใน / Library / LaunchAgents แทน ใช้กฎที่แตกต่างกันสำหรับวิธีที่ launchd จะควบคุมกระบวนการของคุณในทั้งสองกรณี ดูเหมือนว่า LaunchDaemons สงวนไว้สำหรับกระบวนการที่ launchd จะพยายามติดตามอยู่ตลอดเวลา


1

ต่อไปนี้ควรแก้ไขวิธีแก้ปัญหาส่วนใหญ่ (และอยู่ในลำดับของลำดับชั้น):

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 ดูเหมือนจะรับช่วงเป็นค่า 'open files' จาก launchctl ตามค่าเริ่มต้น
  6. คุณสามารถตั้งค่า ulimit ที่กำหนดเองได้ภายใน / etc / profile หรือ ~ / .profile; ในขณะนี้ไม่จำเป็นต้องฉันได้ให้ตัวอย่าง
  7. ใช้ความระมัดระวังเมื่อตั้งค่าใด ๆ เหล่านี้เป็นจำนวนที่สูงมากเมื่อเทียบกับค่าเริ่มต้น - คุณลักษณะที่มีความเสถียร / ความปลอดภัย ฉันนำตัวเลขตัวอย่างเหล่านี้ซึ่งฉันเชื่อว่ามีเหตุผลเขียนบนเว็บไซต์อื่น ๆ
  8. เมื่อข้อ จำกัด ของ launchctl ต่ำกว่าค่า sysctl จะมีรายงานว่าค่า sysctl ที่เกี่ยวข้องจะถูกชนโดยอัตโนมัติเพื่อตอบสนองความต้องการ

1

ประสบการณ์ของฉันคืองานที่ต้องคำนึงถึงกระบวนการจำนวนมากประสบความสำเร็จกับ:

kern.maxproc=2500  # This is as big as I could set it.

kern.maxprocperuid=2048

ulimit -u 2048

สองรายการแรกสามารถเข้าไป/etc/sysctl.confและค่า ulimit ลงใน launchd.conf เพื่อการตั้งค่าที่เชื่อถือได้

เนื่องจาก tcp / ip เป็นส่วนหนึ่งของสิ่งที่ฉันทำฉันจึงจำเป็นต้องชน

kern.ipc.somaxconn=8192

จากค่าเริ่มต้น 128

ก่อนที่ฉันจะเพิ่มขีด จำกัด กระบวนการฉันได้รับความล้มเหลว "ทางแยก" ทรัพยากรไม่เพียงพอ ก่อนที่ฉันจะเพิ่ม kern.ipc.somaxconn ฉันได้รับข้อผิดพลาด "pipe เสีย"

นี่เป็นขณะที่รันจำนวนยุติธรรม (500-4000) ของกระบวนการเดี่ยวบน Mac สัตว์ประหลาดของฉัน, ระบบปฏิบัติการ 10.5.7, แล้ว 10.5.8, ตอนนี้ 10.6.1 ภายใต้ Linux บนคอมพิวเตอร์ของผู้บังคับบัญชามันทำงานได้ดี

ฉันคิดว่าจำนวนกระบวนการจะใกล้เคียงกับ 1,000 แต่ดูเหมือนว่าทุกกระบวนการที่ฉันเริ่มต้นรวมถึงสำเนาของเชลล์เองนอกเหนือจากรายการจริงที่ทำงานจริง เทศกาลมาก

ฉันเขียนของเล่นดิสเพลย์ที่มีลักษณะเหมือน:

#!/bin/sh

while[ 1 ]

do

    n=netstat -an | wc -l

    nw=netstat -an | grep WAIT | wc -l

    p=ps -ef | wc -l

    psh=ps -ef | fgrep sh | wc -l

    echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"

    sleep 0.5

done

และดูจำนวนสูงสุดของกระบวนการใน ps -ef และแขวนอยู่รอบ ๆ ใน netstat ที่กำลังTIME_WAITจะหมดอายุ ... ด้วยขีด จำกัด ที่เพิ่มขึ้นฉันเห็นTIME_WAITรายการมากกว่า3,500 รายการ

ก่อนที่ฉันจะเพิ่มขีด จำกัด ฉันสามารถ 'แอบ' ขีดจำกัดความล้มเหลวซึ่งเริ่มต้นที่ต่ำกว่า 1K แต่เพิ่มขึ้นเป็น 1190 ค่าสูง .. ทุกครั้งที่มันถูกผลักจนล้มเหลวมันอาจต้องใช้เวลาอีกเล็กน้อย แคชที่ขยายเป็นขีด จำกัด ทุกครั้งที่ล้มเหลว

แม้ว่ากรณีทดสอบของฉันมี "รอ" เป็นคำสั่งสุดท้ายยังมีกระบวนการแยกเดี่ยวจำนวนมากแขวนอยู่รอบ ๆ หลังจากออก

ฉันได้รับข้อมูลส่วนใหญ่ที่ฉันใช้จากการโพสต์บนอินเทอร์เน็ต แต่ไม่ใช่ทั้งหมดที่ถูกต้อง ระยะของคุณอาจแตกต่างกันไป

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