Apa sebenarnya yang dilakukan serverperfmode = 1 pada macOS?


24

Menyalakannya dijelaskan di sini tetapi tidak ada detail.

Ada deskripsi yang tidak jelas:

Mode kinerja mengubah parameter sistem Mac Anda. Perubahan ini memanfaatkan perangkat keras Anda dengan lebih baik untuk menuntut aplikasi server.

Apa yang sebenarnya berubah di dalam sistem / kernel?

Jawaban:


16

Mengaktifkan Server Performance Mode pada dasarnya meningkatkan beberapa parameter kernel / net terkait dengan jumlah maksimum dari proses dan koneksi yang mungkin / diizinkan dan memodifikasi beberapa pengaturan memori / timer:

...
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

Tujuannya adalah untuk memungkinkan lebih banyak file terbuka (terutama diperlukan untuk server web) dan koneksi untuk melayani lebih banyak klien pada saat yang sama dan membuang utas server tunggal lebih cepat dari memori / memori virtual (jika saya menginterpretasikan modifikasi tertentu dengan benar).


Di masa lalu, Apple merilis OS yang berbeda dan sekarang server memuat di atas OS konsumen beberapa penyetelan dasar dapat membantu sistem operasi menjalankan proses untuk 25 pengguna yang terhubung ke server alih-alih disetel untuk satu orang yang menggunakan OS. Penyetelan ini hanyalah titik awal - siapa pun yang ingin server mereka berkinerja di bawah beban tinggi perlu menyesuaikan dan memantau hal-hal pada tingkat yang jauh lebih rinci daripada mengaktifkan atau menonaktifkan mode kinerja.

Juga, batas-batas ini sebagian besar untuk mencegah perangkat lunak buruk dari menjatuhkan server dengan menghabiskan sumber daya terbatas seperti saluran pensinyalan komunikasi antar proses (IPC). Pada sistem di mana satu pengguna berjalan, Anda ingin menghentikan proses pelarian lebih cepat daripada jika ada puluhan proses yang berjalan untuk puluhan pengguna. "Kinerja" dapat dilihat sebagai menaikkan beberapa batasan keras yang bertentangan dengan "melayani satu file atau satu halaman web lebih cepat".


Karena ada lebih dari 1100 item spesifik yang dilaporkan oleh sysctl -aini adalah ringkasan yang sangat bagus dari hal-hal yang mungkin Anda tonton pertama kali jika Anda baru mengenal penyetelan server atau modifikasi parameter kernel. Saya akan menambahkan beberapa "pendapat" pada jawaban jika membantu orang lain. Harap kembalikan hasil edit saya jika pendapat yang diajukan bukan milik Anda.
bmike

Apakah ini berfungsi pada macbook pro juga?
Tadej

1
@JedatKinports Ini juga berfungsi untuk MacBook, ya
klanomath

Dan apakah pengaturan "# sangat spesial" ini? Lebih lanjut: Saya pikir ada beberapa pengaturan non-sysctl yang diubah juga. Izin diperketat; 'hal' lain yang sama-sama berbeda di versi mandiri OS X Server yang lebih lama?
LаngLаngС

9

Mode Performa Server (alias perfmodeatau serverperfmode) mengubah sejumlah parameter kernel, menyimpan lebih banyak memori untuk kernel agar dapat memberikan batas yang lebih tinggi dan dengan demikian memungkinkan lebih banyak proses untuk dijalankan, file menjadi terbuka, dan koneksi jaringan menjadi ditangani, antara lain. Semua parameter berskala dengan jumlah memori terpasang, dalam batas, dan tidak ada yang berubah kecuali Anda memiliki setidaknya 16 GiB memori terpasang . Nomor @ klanomath sesuai dengan memiliki 16 GiB memori terpasang.

Berikut adalah deskripsi singkat dari dokumen dukungan lama dari Apple tentang Server 10.6:

  • Untuk setiap 8GB memori terpasang, tersedia 2500 proses dan 150.000 vnode.
  • Jumlah maksimum utas diatur ke lima kali (5x) jumlah proses maksimum. (Ini sepertinya tidak lagi benar)
  • ID pengguna tunggal (uid) dapat menggunakan hingga 75% dari jumlah maksimum proses.
  • Satu proses tunggal dapat mengalokasikan hingga 20% dari nilai utas maksimum.

Dalam mode kinerja dengan memori 48 GiB, saya melihat:

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

Jika Anda benar-benar ingin menggali ke dalamnya, Anda dapat membaca kode yang sebenarnya. Di bawah ini dari El Capitan 10.11.6. Mode server masih sama (hingga kode yang baru-baru ini diterbitkan, yaitu dari OS X 10.14 Mojave), tetapi mode normal mendapat tonjolan kinerja mulai di OS X 10.13 High Sierra jika Anda memiliki setidaknya 12 GiB memori (termasuk perubahan dalam komentar dalam kode).

The scale_seutpfungsi set up scalefaktor seperti floor(memsize / 8 GiB)jika Anda memiliki Server Kinerja Mode diaktifkan dan setidaknya 16 GB dari memori yang terpasang. Kalau tidak, nol kecuali Anda memiliki setidaknya 3 GiB memori, dalam hal ini adalah 2, atau, dimulai dengan High Sierra , memsize / 4 GiB. (Nilai task_maxdi awal potongan kode diatur ketika kernel dibangun, dan tidak jelas bagaimana itu akan ditetapkan oleh Apple ketika mendistribusikan OS X. Mungkin 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; 
    }

Kemudian scalefaktor itu diterapkan di bsd_scale_setup(hanya untuk kernel 64-bit) atau di sini untuk High Sierra . Ini memodifikasi parameter kernel yang dibahas di atas dan dapat dilihat melalui sysctl. Perhatikan bahwa jika Server Performance Mode tidak diaktifkan, satu - satunya hal yang diskalakan adalah maxproc(532 -> 1064) dan maxprocperuid(266 -> 709) hingga High Sierra, kapan maxfilesdan maxfilesperprocjuga terbentur jika Anda memiliki setidaknya 12 GiB memori.

    /* 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);
        }
    }

Akhirnya, faktor skala juga diterapkan di bsd_exec_setup. Ini mengkonfigurasi berapa banyak memori kernel dicadangkan untuk mengumpulkan semua data yang diperlukan untuk menginisialisasi suatu proses. Bagaimana prosesnya akan execlayak bab penuh dalam sebuah buku tentang kernel Unix jadi saya tidak akan masuk ke sini. Konsekuensi tingkat tinggi dari pengaturan ini adalah bahwa jumlah yang lebih besar membutuhkan lebih banyak memori, tetapi memungkinkan jumlah proses yang lebih besar untuk dibuat per detik. (Meskipun kode ini tetap sama hingga saat ini / Mojave, efeknya berubah dengan perubahan dalam cara scaledikomputasi di High Sierra. Ingat detail di atas: di High Sierra dan kemudian, skala kira-kira ( memory / 4 GiB) untuk mode normal dan ( memory / 8 GiB) untuk mode server. Jadi bsd_simul_execssebenarnya bisa turun ketika Anda beralih ke mode server.)

    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);

Untuk El Capitan sampai sekarang / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024jadi untuk 48 GiB Mac saya kernel akan mencadangkan sekitar 67 MiB memori seperti ruang penyangga untuk mengatur proses baru yang akan dihasilkan. Di satu sisi, itu adalah angka tinggi yang gila, bahkan untuk server web. Di sisi lain, 67 MiB adalah kacang dibandingkan dengan 48 GiB pada mesin.

Jadi Server Performance Mode memang mengambil lebih banyak memori, dan membuat sistem lebih mungkin untuk menderita jika beberapa program keluar dari kendali sumber daya yang dikonsumsi, tetapi sangat meningkatkan kemampuan sistem untuk menangani lebih banyak tugas latar belakang. Saya pikir Apple membuat panggilan yang benar dengan tidak menyalakannya secara default tetapi juga membuatnya mudah untuk diaktifkan. Saya senang bahwa dengan High Sierra mereka sekarang menaikkan batas dalam mode normal jika Anda memiliki cukup memori. Saya akan membiarkan mode server mati (dan tidak aktif) di semua komputer saya sampai saya melihat mereka mengalami masalah karena saya memiliki begitu banyak program server yang berjalan di sana. Bagaimanapun, itu tidak mempercepat jam sistem, itu tidak meningkatkan kecepatan disk, dan itu hanya meningkatkan I / O jaringan jika Anda memiliki ratusan koneksi. Sana'

Di sisi lain, jika Anda benar-benar harus menjalankan 2000 proses, mode server adalah satu-satunya pilihan hingga Anda mencapai High Sierra. Berita baiknya adalah cukup mudah untuk dihidupkan, dicoba, dan jika Anda tidak menyukainya, matikan kembali.


👏🏻! Saran bagus untuk diperhatikan di dekat kesimpulan: "Saya akan mematikan mode server [...]".
dan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.