Що насправді serverperfmode = 1 робить у macOS?


24

Увімкнення його описано тут, але деталей немає.

Є розпливчастий опис:

Режим продуктивності змінює системні параметри вашого Mac. Ці зміни надають перевагу вашому обладнання для вимогливих серверних додатків.

Що насправді змінюється всередині системи / ядра?

Відповіді:


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 випускала іншу ОС, а тепер, коли сервер завантажує поверх споживчої ОС деякі основні настройки, можуть допомогти операційній системі запустити процеси для 25 користувачів, які підключаються до сервера, а не налаштовуються на одну особу, яка використовує ОС. Ці налаштування є лише відправною точкою - кожен, хто хоче, щоб їх сервер працював під високим навантаженням, повинен налаштовувати та контролювати речі на набагато більш детальному рівні, ніж увімкнути або вимкнути режим роботи.

Крім того, ці обмеження здебільшого мають на меті запобігання збитковій програмі збиття сервера шляхом вичерпання обмежених ресурсів, таких як міжсистемні канали сигналізації зв'язку (ipc). У системі, де працює один користувач, ви хочете зупинити відвернутий процес швидше, ніж якщо для десятків користувачів запущені десятки процесів. "Продуктивність" може розглядатися як підвищення деяких жорстких обмежень на відміну від "швидше обслуговувати один файл або одну веб-сторінку".


Оскільки повідомляється про понад 1100 конкретних елементів, sysctl -aце дуже приємний підсумок речей, які ви можете спочатку переглянути, якщо ви не знайомі з налаштуванням сервера або зміною параметрів ядра. Я додам у відповідь певну "думку" у випадку, якщо це допомагає іншим. Скасуйте мої зміни, якщо висловлені думки не ваші.
bmike

Чи працює це і на macbook pro?
Тадей

1
@JedatKinports Це також працює для MacBooks, так
klanomath

А які ці "#very special" настройки? Далі: Я думаю, що деякі налаштування non-sysctl також змінені. Дозволи посилено; інші «речі» однаково відрізняються у старих версіях автономного OS X Server?
LаngLangС

9

Режим продуктивності сервера (ака perfmodeабо serverperfmode) змінює ряд параметрів ядра, зберігаючи набагато більше пам’яті для ядра, щоб забезпечити набагато більш високі обмеження і тим самим дати можливість запускати набагато більше процесів, відкривати файли та мережеві з'єднання. обробляється, серед іншого. Всі параметри масштабуються з кількістю встановленої пам'яті в межах, і нічого не змінюється, якщо у вас не встановлено принаймні 16 ГБ пам'яті . @ klanomath номери відповідають встановленому 16 ГБ пам'яті.

Ось короткий опис старого документа підтримки від Apple про Сервер 10.6:

  • На кожні 8 ГБ встановленої пам’яті доступно 2500 процесів і 150 000 внесків.
  • Максимальна кількість потоків встановлюється в п’ять разів (5х) кількість максимальних процесів. (Здається, це вже не так)
  • Один ідентифікатор користувача (uid) може використовувати до 75% максимальної кількості процесів.
  • Один процес може виділити до 20% максимального значення потоку.

У режимі продуктивності з 48 Гб пам'яті я бачу:

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 High Sierra, якщо у вас є щонайменше 12 ГБ пам'яті (включені зміни у коментарях у коді).

У scale_seutpфункції встановлює scaleфактор , як floor(memsize / 8 GiB)якщо у вас включений режим продуктивності сервера і принаймні 16 Гігабайт пам'яті встановлено. В іншому випадку він дорівнює нулю, якщо у вас є щонайменше 3 ГБ пам’яті, в цьому випадку це 2, або, починаючи з High Sierra , memsize / 4 GiB. (Значення task_maxна початку фрагмента коду встановлюється під час побудови ядра, і незрозуміло, як воно встановлюється Apple при розповсюдженні ОС X. Це, мабуть, 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-бітного ядра) або тут для High Sierra . Це змінює параметри ядра, про які йшлося вище та видно через sysctl. Зауважте, що якщо режим роботи сервера не ввімкнено, єдине , що масштабується, - це maxproc(532 -> 1064) і maxprocperuid(266 -> 709) до високої Sierra, коли maxfilesі maxfilesperprocтакож піддаються ударам, якщо у вас є щонайменше 12 ГБ пам'яті.

    /* 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гідним повної глави книги про ядро ​​Unix, тому я не буду тут заглиблюватися. Наслідком цього параметра є високий рівень того, що більша кількість займає більше пам'яті, але дозволяє створювати більшу кількість процесів за секунду. (Хоча цей код залишився колишнім у теперішньому / Mojave, ефект змінився зі зміною способу 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);

Для El Capitan через теперішній час / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024так що для мого 48 GiB Mac ядро ​​залишить близько 67 МБ пам'яті так само, як буферний простір для налаштування нових процесів, які потрібно породжувати. З одного боку, це шалено високе число навіть для веб-сервера. З іншого боку, 67 МіБ - це арахіс порівняно з 48 Гб на машині.

Таким чином, режим продуктивності сервера займає більше пам’яті, і система набагато частіше страждає, якщо якась програма виходить з-під контролю споживаючих ресурсів, але значно збільшує можливості системи для вирішення набагато більше фонових завдань. Я думаю, що Apple зробила правильний дзвінок, не включивши його за замовчуванням, але й полегшивши його. Я радий, що з High Sierra вони зараз піднімають ліміти у звичайному режимі, якщо у вас достатньо пам’яті. Я б залишив серверний режим вимкнутим (і залишив його вимкненим) на всіх моїх комп’ютерах, поки я не помітив, що вони стикаються з проблемами, тому що в мене так багато серверних програм. Зрештою, він не прискорює системний такт, не збільшує швидкість диска, а лише збільшує мережевий введення / вивід, якщо у вас сотні підключень. Там '

З іншого боку, якщо вам справді потрібно запустити 2000 процесів, серверний режим - ваш єдиний варіант, поки ви не дістанетесь до Високої Сьєрри. Хороша новина полягає в тому, що досить просто увімкнути, спробувати, а якщо вам це не подобається, вимкніть назад.


👏🏻! Приємна порада зазначити біля висновку: "Я б залишив серверний режим вимкненим […]".
дан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.