जवाबों:
सर्वर के प्रदर्शन मोड को चालू करने से आवश्यक / अनुमत प्रक्रियाओं और कनेक्शनों की अधिकतम संख्या से संबंधित कुछ कर्नेल / नेट पैरामीटर बढ़ जाते हैं और कुछ मेमोरी / टाइमर सेटिंग्स को संशोधित करता है:
...
kern.maxvnodes: 66560 > 300000
kern.maxproc: 1064 > 5000
...
kern.maxfilesperproc: 10240 > 150000
kern.maxprocperuid: 709 > 3750
kern.ipc.maxsockbuf: 4194304 > 8388608
...
kern.ipc.somaxconn: 128 > 1024
...
kern.ipc.nmbclusters: 32768 > 65536
...
kern.ipc.sbmb_cnt_peak: 1120 > 1170
...
kern.ipc.njcl: 10920 > 21840
...
kern.timer.longterm.qlen: 100 > 0
kern.timer.longterm.threshold: 1000 > 0
...
net.inet.ip.maxfragpackets: 1024 > 2048
...
net.inet.tcp.tcbhashsize: 4096 > 8192
...
net.inet.tcp.fastopen_backlog: 10 > 200
...
net.inet6.ip6.maxfragpackets: 1024 > 2048
...
net.inet6.ip6.maxfrags: 2048 > 4096
#and some very special vm page-outs/compressor and and memory/cache settings
लक्ष्य अधिक खुली फाइलों (विशेष रूप से वेब सर्वर के लिए आवश्यक) और कनेक्शन को एक ही समय में और अधिक ग्राहकों की सेवा करने और स्मृति / आभासी मेमोरी से तेजी से एकल सर्वर थ्रेड को छोड़ने की अनुमति देना है (यदि मैं कुछ संशोधनों की सही व्याख्या करता हूं)।
अतीत में, Apple ने एक अलग OS जारी किया था और अब वह सर्वर उपभोक्ता OS के शीर्ष पर लोड होता है कुछ बुनियादी ट्यूनिंग ऑपरेटिंग सिस्टम को 25 उपयोगकर्ताओं के लिए प्रक्रियाओं को चलाने में मदद कर सकती है जो OS का उपयोग करने वाले एक व्यक्ति के लिए एक सर्वर से कनेक्ट होने के बजाय एक सर्वर से कनेक्ट होते हैं। ये ट्यूनिंग सिर्फ एक शुरुआती बिंदु है - कोई भी जो अपने सर्वर को उच्च लोड प्रदर्शन के तहत प्रदर्शन या बंद करने की तुलना में कहीं अधिक विस्तृत स्तर पर चीजों को अनुकूलित और मॉनिटर करने की आवश्यकता चाहता है।
इसके अलावा, ये सीमाएं खराब सॉफ्टवेयर को सीमित प्रक्रिया संचार सिगनल चैनलों (आईपीसी) जैसे सीमित संसाधनों को समाप्त करके एक सर्वर को लाने से रोकने के लिए हैं। एक सिस्टम पर जहां एक उपयोगकर्ता चल रहा है, आप जल्द से जल्द एक भगोड़ा प्रक्रिया को रोकना चाहते हैं यदि दर्जनों उपयोगकर्ता के लिए दर्जनों प्रक्रियाएं चल रही हैं। "प्रदर्शन" को कुछ कठिन सीमाओं को बढ़ाने के रूप में देखा जा सकता है "एक फ़ाइल या एक वेब पेज तेजी से सेवा" के विपरीत।
सर्वर प्रदर्शन मोड (उर्फ perfmode
या serverperfmode
) कर्नेल मापदंडों की एक संख्या को बदलता है, कर्नेल के लिए बहुत अधिक मेमोरी का संग्रह करता है ताकि बहुत अधिक सीमाएं प्रदान की जा सकें और इस प्रकार बहुत अधिक प्रक्रियाएं चलाने में सक्षम हो, फाइलें खुली रहें, और नेटवर्क कनेक्शन बनें अन्य बातों के अलावा, संभाला। जब तक आपके पास कम से कम 16 GiB की मेमोरी स्थापित नहीं हो जाती है, तब तक सभी पैरामीटर पैरामीटर की सीमा के भीतर स्थापित हो जाते हैं, और कुछ भी नहीं बदलता है । @ klanomath की संख्या 16 GiB स्मृति के स्थापित होने के अनुरूप है।
यहाँ सर्वर 10.6 के बारे में Apple के एक पुराने समर्थन दस्तावेज़ का संक्षिप्त विवरण दिया गया है :
- स्थापित स्मृति के प्रत्येक 8GB के लिए, 2500 प्रक्रियाएं और 150,000 vnodes उपलब्ध हैं।
- थ्रेड्स की अधिकतम संख्या अधिकतम प्रक्रियाओं की संख्या से पांच गुना (5x) पर सेट है। (यह अब सच नहीं लगता)
- एक एकल उपयोगकर्ता आईडी (यूआईडी) अधिकतम 75% प्रक्रियाओं का उपयोग कर सकती है।
- एक एकल प्रक्रिया अधिकतम थ्रेड्स मान का 20% तक आवंटित कर सकती है।
स्मृति के 48 GiB के साथ प्रदर्शन मोड के तहत, मैं देखता हूं:
kern.maxvnodes: 900000
kern.maxproc: 15000
kern.maxprocperuid: 11250
kern.num_tasks: 15000
kern.num_taskthreads: 15000
kern.num_threads: 75000
kern.maxfiles: 900000
kern.maxfilesperproc: 450000
kern.ipc.maxsockbuf:8388608
kern.ipc.somaxconn: 2048
kern.ipc.nmbclusters: 131072
kern.ipc.sbmb_cnt_peak: # This parameter is not in my kernel
kern.ipc.njcl: 43688
...
kern.timer.longterm.qlen: 0 # same
kern.timer.longterm.threshold: 0 # same
...
net.inet.ip.maxfragpackets: 4096
...
net.inet.tcp.tcbhashsize: 32768
net.inet.tcp.fastopen_backlog: 600
...
net.inet6.ip6.maxfragpackets: 4096
net.inet6.ip6.maxfrags: 8192
यदि आप वास्तव में इसे खोदना चाहते हैं, तो आप वास्तविक कोड पढ़ सकते हैं। नीचे एल कैपिटन 10.11.6 से है। सर्वर मोड अब भी वही है (सबसे हाल ही में प्रकाशित कोड तक, जो कि OS X 10.14 Mojave से है), लेकिन सामान्य मोड में OS X 10.13 हाई सिएरा में शुरू होने वाला परफॉर्मेंस बम्प मिला है, अगर आपके पास कम से कम 12 GiB मेमोरी है (बदलाव शामिल हैं) कोड में टिप्पणियों में)।
scale_seutp
समारोह सेट scale
कारक के रूप में floor(memsize / 8 GiB)
यदि आप सर्वर प्रदर्शन मोड सक्षम और स्मृति के कम से कम 16 GiB स्थापित की है। अन्यथा यह शून्य है जब तक कि आपके पास कम से कम 3 GiB मेमोरी न हो, जिस स्थिति में यह 2 है, या, हाई सिएरा के साथ शुरू , मेम / 4 GiB को याद करता है। ( task_max
कोड स्निपेट की शुरुआत में मान तब सेट होता है जब कर्नेल बनाया जाता है, और यह स्पष्ट नहीं है कि OS X वितरित करते समय यह Apple द्वारा कैसे सेट किया जाता है। यह संभवतः 1024 है।)
typeof(task_max) task_max_base = task_max;
/* Raise limits for servers with >= 16G */
if ((serverperfmode != 0) && ((uint64_t)sane_size >= (uint64_t)(16 * 1024 * 1024 *1024ULL))) {
scale = (int)((uint64_t)sane_size / (uint64_t)(8 * 1024 * 1024 *1024ULL));
/* limit to 128 G */
if (scale > 16)
scale = 16;
task_max_base = 2500;
} else if ((uint64_t)sane_size >= (uint64_t)(3 * 1024 * 1024 *1024ULL))
scale = 2;
/* Starting with OS X 10.13 High Sierra, if more than 8 GiB of memory,
* scale = sane_size / 4 GiB with max of 16 (64 GiB or more)
*/
task_max = MAX(task_max, task_max_base * scale);
if (scale != 0) {
task_threadmax = task_max;
thread_max = task_max * 5;
}
फिर उस scale
कारक को bsd_scale_setup
(केवल 64-बिट कर्नेल के लिए) या हाई सिएरा के लिए यहां लागू किया जाता है । यह कर्नेल मापदंडों को संशोधित करता है जो ऊपर चर्चा कर रहे हैं और के माध्यम से दिखाई दे रहे हैं sysctl
। ध्यान दें कि यदि सर्वर प्रदर्शन मोड सक्षम नहीं है, तो केवल एक चीज जो स्केल की गई है maxproc
(532 -> 1064) और maxprocperuid
(266 -> 709) हाई सिएरा तक, जब maxfiles
और maxfilesperproc
कम से कम 12 GiB की मेमोरी हो तो भी टकरा जाती है।
/* The initial value of maxproc here is 532 */
if ((scale > 0) && (serverperfmode == 0)) {
maxproc *= scale;
maxprocperuid = (maxproc * 2) / 3;
/* Starting with OS X 10.13 High Sierra, this clause is added
if (scale > 2) {
maxfiles *= scale;
maxfilesperproc = maxfiles/2;
}
*** end of High Sierra addition */
}
/* Apply server scaling rules */
if ((scale > 0) && (serverperfmode !=0)) {
maxproc = 2500 * scale;
hard_maxproc = maxproc;
/* no fp usage */
maxprocperuid = (maxproc*3)/4;
maxfiles = (150000 * scale);
maxfilesperproc = maxfiles/2;
desiredvnodes = maxfiles;
vnodes_sized = 1;
tcp_tfo_backlog = 100 * scale;
if (scale > 4) {
/* clip somaxconn at 32G level */
somaxconn = 2048;
/*
* For scale > 4 (> 32G), clip
* tcp_tcbhashsize to 32K
*/
tcp_tcbhashsize = 32 *1024;
if (scale > 7) {
/* clip at 64G level */
max_cached_sock_count = 165000;
} else {
max_cached_sock_count = 60000 + ((scale-1) * 15000);
}
} else {
somaxconn = 512*scale;
tcp_tcbhashsize = 4*1024*scale;
max_cached_sock_count = 60000 + ((scale-1) * 15000);
}
}
अंत में, स्केल फैक्टर को भी लागू किया जाता है bsd_exec_setup
। यह कॉन्फ़िगर करता है कि किसी प्रक्रिया को प्रारंभ करने के लिए आवश्यक सभी डेटा को इकट्ठा करने के लिए कितना कर्नेल मेमोरी आरक्षित है। कैसे एक प्रक्रिया है exec
'd यूनिक्स कर्नेल पर एक किताब में एक पूर्ण अध्याय के योग्य है इसलिए मैं यहां नहीं जाऊंगा। इस सेटिंग का उच्च-स्तरीय परिणाम यह है कि एक बड़ी संख्या अधिक मेमोरी लेती है, लेकिन बड़ी संख्या में प्रक्रियाओं को प्रति सेकंड बनाने की अनुमति देती है। (हालांकि यह कोड वर्तमान / मोजावे के माध्यम से एक ही रहा है, लेकिन scale
उच्च सिएरा में इसका अनुपालन कैसे किया जाता है, में परिवर्तन के साथ प्रभाव बदल गया है। ऊपर दिए गए विवरणों को याद करें: उच्च सिएरा और बाद में, memory / 4 GiB
सामान्य मोड और ( memory / 8 GiB
) के लिए पैमाने मोटे तौर पर ( ) है। सर्वर मोड के लिए। इसलिए bsd_simul_execs
जब आप सर्वर मोड पर जाते हैं तो वास्तव में नीचे जा सकते हैं।)
switch (scale) {
case 0:
case 1:
bsd_simul_execs = BSD_SIMUL_EXECS;
break;
case 2:
case 3:
bsd_simul_execs = 65;
break;
case 4:
case 5:
bsd_simul_execs = 129;
break;
case 6:
case 7:
bsd_simul_execs = 257;
break;
default:
bsd_simul_execs = 513;
break;
}
bsd_pageable_map_size = (bsd_simul_execs * BSD_PAGEABLE_SIZE_PER_EXEC);
वर्तमान / Mojave के माध्यम से El Capitan के BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024
लिए, इसलिए मेरे 48 GiB मैक के लिए कर्नेल को 67 MiB मेमोरी के रूप में आरक्षित किया जाएगा, ताकि नई प्रक्रियाओं को स्थापित करने के लिए बफर स्पेस हो। एक तरफ, वह एक पागल उच्च संख्या है, यहां तक कि एक वेब सर्वर के लिए भी। दूसरी ओर, मशीन पर 48 GiB की तुलना में 67 MiB मूंगफली है।
इसलिए सर्वर परफ़ॉर्मेंस मोड अधिक मेमोरी लेता है, और यदि सिस्टम कुछ खपत नियंत्रण संसाधनों से बाहर चला जाता है, तो सिस्टम को और अधिक नुकसान होने की संभावना है, लेकिन बहुत अधिक पृष्ठभूमि कार्यों को संभालने के लिए सिस्टम की क्षमता बढ़ जाती है। मुझे लगता है कि Apple ने डिफ़ॉल्ट रूप से इसे चालू नहीं करके सही कॉल किया, लेकिन इसे सक्षम करना भी आसान बना दिया। मुझे खुशी है कि उच्च सिएरा के साथ वे अब सामान्य मोड में सीमा बढ़ा रहे हैं यदि आपके पास पर्याप्त मेमोरी है। मैं अपने सभी कंप्यूटरों पर सर्वर मोड को बंद कर दूंगा (तब तक इसे छोड़ दिया है) जब तक कि मैं उन्हें मुद्दों में चलने की सूचना नहीं देता क्योंकि मेरे पास इस पर चलने वाले बहुत सारे सर्वर प्रोग्राम हैं। आखिरकार, यह सिस्टम घड़ी को गति नहीं देता है, यह डिस्क की गति को नहीं बढ़ाता है, और यह केवल नेटवर्क I / O को बढ़ाता है यदि आपके पास सैकड़ों कनेक्शन हैं। वहाँ'
दूसरी ओर, यदि आपको वास्तव में 2000 प्रक्रियाओं को चलाने की आवश्यकता है, तो सर्वर मोड आपके लिए एकमात्र विकल्प है जब तक आप हाई सिएरा में नहीं जाते। अच्छी खबर यह है कि इसे चालू करना, बाहर की कोशिश करना काफी आसान है, और यदि आपको यह पसंद नहीं है, तो वापस बंद करें।
sysctl -a
हैं, जो आपके द्वारा पहले देखी जा सकने वाली चीजों का एक बहुत अच्छा सारांश है यदि आप सर्वर ट्यूनिंग या कर्नेल पैरामीटर संशोधनों के लिए नए हैं। मैं उस मामले में जवाब के लिए कुछ "राय" जोड़ूंगा जो दूसरों की मदद करता है। यदि मेरे द्वारा व्यक्त किए गए आपके नहीं हैं, तो कृपया मेरे संपादन वापस करें।