Режим продуктивності сервера (ака 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 процесів, серверний режим - ваш єдиний варіант, поки ви не дістанетесь до Високої Сьєрри. Хороша новина полягає в тому, що досить просто увімкнути, спробувати, а якщо вам це не подобається, вимкніть назад.
sysctl -a
це дуже приємний підсумок речей, які ви можете спочатку переглянути, якщо ви не знайомі з налаштуванням сервера або зміною параметрів ядра. Я додам у відповідь певну "думку" у випадку, якщо це допомагає іншим. Скасуйте мої зміни, якщо висловлені думки не ваші.