OS X (10.5) पर उल्लिखित डिफॉल्ट अलिमेट्स कहाँ हैं?


26

nofileOS X उपयोगकर्ता खातों के लिए डिफ़ॉल्ट सीमा इन दिनों लगभग 256 फ़ाइल विवरणकों से प्रतीत होती है। मैं कुछ ऐसे सॉफ़्टवेयर का परीक्षण करने की कोशिश कर रहा हूं, जिन्हें एक बार में खोलने की तुलना में बहुत अधिक कनेक्शन की आवश्यकता होती है।

एक विशिष्ट डेबियन बॉक्स पर, जो पीएम लिमिट मॉड्यूल चला रहा है, मैं /etc/security/limits.confसॉफ्टवेयर चलाने वाले उपयोगकर्ता के लिए उच्च सीमाएँ संपादित करने के लिए संपादित करूँगा , लेकिन मैं ओएस एक्स में इन सीमाओं को सेट करने के लिए रहस्यमय हूँ।

क्या इसके लिए कोई GUI है? क्या इसके लिए कहीं एक कॉन्फ़िगर फ़ाइल है? OS X पर डिफ़ॉल्ट ulimits को बदलने का सबसे आसान तरीका क्या है?


मैक ओएस एक्स लायन के लिए, सुपरयुजर
.

जवाबों:


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
क्या आप इसके लिए आधिकारिक दस्तावेज़ में लिंक जोड़ सकते हैं?
ग्लिफ़

7
यार, अगर यह कहीं भी प्रलेखित किया गया था , तो इस पृष्ठ की आवश्यकता नहीं होगी
डेव चेनी

1
स्नो लेपर्ड पर काम नहीं करता।
इस्माइल

1
किसी भी विचार यह कैसे अलग है sysctl.maxfiles? (संबंधित प्रश्न: apple.stackexchange.com/questions/33715/too-many-open-files )
keflavich

2
छोटा सुधार: आप echosudo के तहत चल रहे हैं, लेकिन अपने अनप्लग शेल को फ़ाइल में जोड़ने की कोशिश कर रहे हैं, जिसे करने की अनुमति नहीं है। echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.confइसके बजाय कोशिश करें ।
विनीत

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

काम नहीं करता है क्योंकि sudo गलत जगह पर है, यह कोशिश करें:

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

3
यह संभवत: उस उत्तर के लिए "सुझाए गए संपादन" के रूप में बेहतर होगा जिसका आप उल्लेख कर रहे हैं।
क्रिस जॉन्सन

3

खोल की सीमा

खोल और प्रक्रियाओं के लिए उपलब्ध संसाधन द्वारा बदला जा सकता ulimitआदेश है जो इस तरह के रूप में स्टार्टअप स्क्रिप्ट में जोड़ा जा सकता ~/.bashrcहै या ~/.bash_profileव्यक्तिगत उपयोगकर्ताओं के लिए या /etc/bashrcसभी उपयोगकर्ताओं के लिए । जोड़ने के लिए उदाहरण पंक्ति:

ulimit -Sn 4096 && ulimit -Sl unlimited

देखें: help ulimitऔर man bashअधिक जानकारी के लिए।

सिस्टम की सीमा

सामान्य तौर पर, सिस्टम सीमाएं लॉन्चड फ्रेमवर्क द्वारा नियंत्रित की जाती हैं और इसे launchctlकमांड द्वारा बदला जा सकता है , जैसे

launchctl limit maxfiles 10240 unlimited

परिवर्तनों को लगातार बनाए रखने के लिए, आपको विशिष्ट लॉन्च अनुरूप फ़ोल्डर में एक संपत्ति सूची फ़ाइल बनाने की आवश्यकता है जो स्टार्टअप एजेंट के रूप में कार्य करती है।

इस तरह की स्टार्टअप फाइल बनाने का उदाहरण यहां दिया गया है:

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:।

देखें: लॉन्च डेमॉन और एजेंटों बनाना

कर्नेल सीमा

  • कर्नेल सीमाएँ sysctlकमांड द्वारा नियंत्रित की जाती हैं ।
  • वर्तमान कर्नेल सीमाएँ देखने के लिए, चलाएँ sysctl -a | grep ^kern.max:।
  • खोलने, चलाने के लिए अनुमत अधिकतम फ़ाइलों को बदलने के लिए sudo sysctl -w kern.maxfiles=20480:।
  • परिवर्तनों को लगातार बनाने के लिए, सिस्टम स्टार्टअप फ़ोल्डर में संपत्ति सूची फ़ाइल बनाने के लिए इसी तरह की उपरोक्त विधि का उपयोग करें।

सम्बंधित:


पदावनत विधियाँ

MacOS के पुराने संस्करण में, आप इन सीमाओं को /etc/sysctl.confसिस्टम-वाइड में सेट कर सकते हैं जैसा कि आप यूनिक्स पर करते हैं, हालांकि, ऐसा लगता है कि यह समर्थित नहीं है।

उपयोग ~/.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, जो 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

ओएस एक्स पर, यदि आप डेमॉन या प्रक्रिया या कार्य के लिए नरम सीमा को संशोधित करने का प्रयास कर रहे हैं, तो इन सॉफ्ट सीमाओं को बदलने का सही तरीका सभी प्रक्रियाओं के लिए डिफ़ॉल्ट लॉन्च कॉन्फिग को बदलना नहीं है , बल्कि इसे उस प्रक्रिया के लिए सेट करके है जो आप हैं दौड़ने की कोशिश कर रहा है।

यह आपकी प्रक्रिया के लिए आपके लॉन्च .plist फ़ाइल में पूरा किया गया है।

यदि आपके पास एक डेमॉन या प्रक्रिया चल रही है, जिसके लिए आपको अधिक खुली फ़ाइलों की आवश्यकता है, तो इसके लिए एक फ़ाइल बनाएँ और इन पैरामेट्स को इसमें जोड़ें:

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

एक उदाहरण, मोंगोडब का उपयोग करना। मैं org.mongo.mongodb.plist नामक एक .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

यदि आपकी प्रक्रिया या कार्य एक डेमॉन की तुलना में एक एजेंट से अधिक है, तो आप इसके बजाय / पुस्तकालय / LaunchAgents में .plist डाल सकते हैं। लॉन्च के लिए अलग-अलग नियम लागू होते हैं कि दोनों ही स्थिति में आपकी प्रक्रिया कैसे नियंत्रित होगी। लॉन्चडैमन्स उन प्रक्रियाओं के लिए आरक्षित हैं जो लॉन्चड हर समय बनाए रखने की कोशिश करेंगे।


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 अब आप ओएस एक्स के तहत 'असीमित' की सीमा निर्धारित नहीं कर सकते
  3. लॉन्चक्टल मैक्सफाइल्स एससीएसटीएल मैक्सफाइल्स द्वारा बंधे होते हैं, और इसलिए उन्हें पार नहीं कर सकते
  4. sysctl को लॉन्च मेर्कल से kern.maxfilesperproc विरासत में मिला है
  5. ulimit को लगता है कि यह मूलभूत रूप से लॉन्चर से 'ओपन फाइल्स' मूल्य है
  6. आप / etc / प्रोफाइल, या ~ / .profile के भीतर एक कस्टम ulimit सेट कर सकते हैं; जबकि यह आवश्यक नहीं है मैंने एक उदाहरण प्रदान किया है
  7. अपने डिफ़ॉल्ट के साथ तुलना करते समय बहुत अधिक संख्या में इन मूल्यों में से किसी को सेट करते समय सतर्क रहें - सुविधाओं में स्थिरता / सुरक्षा मौजूद है। मैंने इन उदाहरण संख्याओं को लिया है जिन्हें मैं उचित मानता हूं, अन्य वेबसाइटों पर लिखा गया है।
  8. जब लॉक्टक्टल सीमाएं एससीएसटीएल वालों की तुलना में कम होती हैं, तो ऐसी रिपोर्टें आई हैं कि रीलेवेंट एससीएक्टल वाले आवश्यकताओं को पूरा करने के लिए स्वचालित रूप से टकराएंगे।

1

मेरा अनुभव यह है कि मेरा उच्च-प्रक्रिया-गणना कार्य केवल इसके साथ सफल हुआ:

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

kern.maxprocperuid=2048

ulimit -u 2048

/etc/sysctl.confविश्वसनीय सेटिंग के लिए पहले दो और लॉन्चड.कॉन्फ़ में ulimit मान जा सकते हैं ।

चूंकि tcp / ip मेरे द्वारा किए जा रहे काम का हिस्सा था, इसलिए मुझे टक्कर देने की भी जरूरत थी

kern.ipc.somaxconn=8192

इसके डिफ़ॉल्ट 128 से।

इससे पहले कि मैं प्रक्रिया की सीमा बढ़ाता, मुझे पर्याप्त संसाधन नहीं, "कांटा" विफलताएं मिल रही थीं। इससे पहले कि मैं kern.ipc.somaxconn बढ़ाता, मुझे "टूटी हुई पाइप" त्रुटियां मिल रही थीं।

यह मेरे राक्षस मैक, ओएस 10.5.7, फिर 10.5.8, अब 10.7.1 पर अलग-अलग प्रक्रियाओं की एक उचित संख्या (500-4000) चला रहा था। मेरे बॉस के कंप्यूटर पर लिनक्स के तहत यह सिर्फ काम किया।

मैंने सोचा था कि प्रक्रियाओं की संख्या 1000 के करीब होगी लेकिन ऐसा लगता है कि मैंने शुरू की प्रत्येक प्रक्रिया में वास्तविक काम करने वाली वास्तविक वस्तु के अलावा शेल की अपनी प्रति भी शामिल थी। बहुत उत्सव।

मैंने एक प्रदर्शन खिलौना लिखा था जो कुछ इस तरह था:

#!/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लिए समाप्त होने की प्रतीक्षा कर रहा है ... सीमाएं बढ़ने के साथ, मैंने 3500+ TIME_WAITआइटम चरम पर देखे ।

इससे पहले कि मैं सीमा को उठाता मैं विफलता सीमा पर 'चुपके' कर सकता था, जो 1K से नीचे शुरू हुआ, लेकिन 1190 के उच्च मूल्य तक बढ़ गया .. हर बार इसे असफलता में धकेल दिया गया, यह अगली बार थोड़ा अधिक हो सकता है, शायद कुछ के कारण कैश किया गया जो हर बार अपनी सीमा तक विस्तारित होने में विफल रहा।

हालांकि मेरे परीक्षण के मामले में एक "प्रतीक्षा" थी क्योंकि इसके अंतिम बयान में अभी भी अलग-अलग प्रक्रियाओं की योजना थी जो इसके बाहर निकलने के बाद चारों ओर लटकी हुई थी।

मुझे अधिकांश जानकारी इंटरनेट पर पोस्टिंग से मिली, लेकिन यह सब सटीक नहीं था। आपका माइलेज अलग-अलग हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.