Macper पर serverperfmode = 1 वास्तव में क्या करता है?


24

इसे चालू करने का वर्णन यहां किया गया है, लेकिन कोई विवरण नहीं है।

एक अस्पष्ट वर्णन है:

प्रदर्शन मोड आपके मैक के सिस्टम मापदंडों को बदलता है। सर्वर अनुप्रयोगों की मांग के लिए ये परिवर्तन आपके हार्डवेयर का बेहतर लाभ उठाते हैं।

वास्तव में सिस्टम / कर्नेल के अंदर क्या बदल रहा है?

जवाबों:


16

सर्वर के प्रदर्शन मोड को चालू करने से आवश्यक / अनुमत प्रक्रियाओं और कनेक्शनों की अधिकतम संख्या से संबंधित कुछ कर्नेल / नेट पैरामीटर बढ़ जाते हैं और कुछ मेमोरी / टाइमर सेटिंग्स को संशोधित करता है:

...
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 का उपयोग करने वाले एक व्यक्ति के लिए एक सर्वर से कनेक्ट होने के बजाय एक सर्वर से कनेक्ट होते हैं। ये ट्यूनिंग सिर्फ एक शुरुआती बिंदु है - कोई भी जो अपने सर्वर को उच्च लोड प्रदर्शन के तहत प्रदर्शन या बंद करने की तुलना में कहीं अधिक विस्तृत स्तर पर चीजों को अनुकूलित और मॉनिटर करने की आवश्यकता चाहता है।

इसके अलावा, ये सीमाएं खराब सॉफ्टवेयर को सीमित प्रक्रिया संचार सिगनल चैनलों (आईपीसी) जैसे सीमित संसाधनों को समाप्त करके एक सर्वर को लाने से रोकने के लिए हैं। एक सिस्टम पर जहां एक उपयोगकर्ता चल रहा है, आप जल्द से जल्द एक भगोड़ा प्रक्रिया को रोकना चाहते हैं यदि दर्जनों उपयोगकर्ता के लिए दर्जनों प्रक्रियाएं चल रही हैं। "प्रदर्शन" को कुछ कठिन सीमाओं को बढ़ाने के रूप में देखा जा सकता है "एक फ़ाइल या एक वेब पेज तेजी से सेवा" के विपरीत।


चूँकि इसमें 1100 से अधिक विशिष्ट वस्तुएं बताई गई sysctl -aहैं, जो आपके द्वारा पहले देखी जा सकने वाली चीजों का एक बहुत अच्छा सारांश है यदि आप सर्वर ट्यूनिंग या कर्नेल पैरामीटर संशोधनों के लिए नए हैं। मैं उस मामले में जवाब के लिए कुछ "राय" जोड़ूंगा जो दूसरों की मदद करता है। यदि मेरे द्वारा व्यक्त किए गए आपके नहीं हैं, तो कृपया मेरे संपादन वापस करें।
bmike

क्या यह मैकबुक प्रो पर भी काम करता है?
तडज

1
@JedatKinports यह मैकबुक के लिए भी काम करता है, हाँ
क्लानोमथ

और ये "# विशेष" सेटिंग्स क्या हैं? इसके अलावा: मुझे लगता है कि कुछ गैर- sysctl सेटिंग्स भी बदली हैं। अनुमतियाँ कड़ी हो गईं; स्टैंडअलोन OS X सर्वर के पुराने संस्करणों में समान रूप से भिन्न अन्य 'चीजें'?
LаngLаngС

9

सर्वर प्रदर्शन मोड (उर्फ 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 प्रक्रियाओं को चलाने की आवश्यकता है, तो सर्वर मोड आपके लिए एकमात्र विकल्प है जब तक आप हाई सिएरा में नहीं जाते। अच्छी खबर यह है कि इसे चालू करना, बाहर की कोशिश करना काफी आसान है, और यदि आपको यह पसंद नहीं है, तो वापस बंद करें।


👏🏻! निष्कर्ष के पास नोट करने के लिए अच्छी सलाह: "मैं सर्वर मोड को छोड़ दूँगा [...]"।
dan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.