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 ได้หรือไม่
Tadej

1
@JedatKinports สิ่งนี้ใช้ได้กับ MacBooks ด้วย
klanomath

และการตั้งค่า "#very special" เหล่านี้คืออะไร เพิ่มเติม: ฉันคิดว่ามีการตั้งค่าที่ไม่ใช่ sysctl เช่นกัน สิทธิ์รัดกุม; 'สิ่ง' อื่น ๆ มีความแตกต่างกันอย่างเท่าเทียมกันใน OS X Server เวอร์ชันเก่าหรือไม่
LаngLаngС

9

โหมดประสิทธิภาพของเซิร์ฟเวอร์ (aka perfmodeหรือserverperfmode) เปลี่ยนจำนวนพารามิเตอร์เคอร์เนลสำรองหน่วยความจำมากขึ้นสำหรับเคอร์เนลเพื่อให้ข้อ จำกัด ที่สูงขึ้นมากและทำให้กระบวนการมากขึ้นในการเรียกใช้ไฟล์ที่จะเปิดและการเชื่อมต่อเครือข่าย จัดการเหนือสิ่งอื่นใด พารามิเตอร์ทั้งหมดปรับขนาดด้วยจำนวนหน่วยความจำที่ติดตั้งอยู่ภายในขีด จำกัด และไม่มีการเปลี่ยนแปลงใด ๆ ยกเว้นว่าคุณมีหน่วยความจำอย่างน้อย 16 GiB ติดตั้งอยู่ หมายเลขของ @ klanomath สอดคล้องกับการติดตั้งหน่วยความจำ 16 GiB

นี่คือคำอธิบายสั้น ๆ จากเอกสารสนับสนุนเก่าจาก Apple เกี่ยวกับ Server 10.6:

  • สำหรับหน่วยความจำที่ติดตั้ง 8GB แต่ละอันจะมีกระบวนการ 2,500 กระบวนการและ 150,000 vnode
  • จำนวนเธรดสูงสุดถูกตั้งค่าเป็นห้าเท่า (5x) จำนวนกระบวนการสูงสุด (ดูเหมือนจะไม่เป็นจริงอีกต่อไป)
  • ID ผู้ใช้เดียว (uid) สามารถใช้งานได้สูงสุด 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

หากคุณต้องการขุดลงไปจริงๆคุณสามารถอ่านรหัสจริงได้ ด้านล่างมาจาก El Capitan 10.11.6 โหมดเซิร์ฟเวอร์ยังคงเหมือนเดิม (จนถึงโค้ดที่เผยแพร่ล่าสุดซึ่งมาจาก OS X 10.14 Mojave) แต่โหมดปกติจะมีการทำงานที่เริ่มต้นใน OS X 10.13 High Sierra หากคุณมีหน่วยความจำอย่างน้อย 12 GiB (รวมการเปลี่ยนแปลง ในความคิดเห็นในรหัส)

scale_seutpชุดฟังก์ชั่นขึ้นscaleปัจจัยที่เป็นfloor(memsize / 8 GiB)ถ้าคุณมีโหมดประสิทธิภาพของเซิร์ฟเวอร์เปิดใช้งานและอย่างน้อย 16 ลิ่มของหน่วยความจำที่ติดตั้ง มิฉะนั้นจะเป็นศูนย์เว้นแต่ว่าคุณจะมีหน่วยความจำอย่างน้อย 3 GiB ซึ่งในกรณีนี้คือ 2 หรือเริ่มต้นด้วย High Sierra memsize / 4 GiB (ค่าtask_maxที่จุดเริ่มต้นของข้อมูลโค้ดถูกตั้งค่าเมื่อเคอร์เนลถูกสร้างขึ้นและมันไม่ชัดเจนว่า Apple ได้รับการตั้งค่าอย่างไรเมื่อแจกจ่าย OS 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) จนถึง High Sierra เมื่อใด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ค่าเพียงหนึ่งบทในหนังสือบนเคอร์เนล Unix ดังนั้นฉันจะไม่เข้าไปที่นี่ ผลลัพธ์ระดับสูงของการตั้งค่านี้คือจำนวนที่มากขึ้นใช้หน่วยความจำมากขึ้น แต่อนุญาตให้สร้างกระบวนการจำนวนมากขึ้นต่อวินาที (แม้ว่ารหัสนี้จะยังคงเหมือนเดิมผ่านปัจจุบัน / โมฮาวีผลที่เปลี่ยนไปกับการเปลี่ยนแปลงในวิธีการscaleคำนวณใน High Sierra จำรายละเอียดข้างต้นได้: ใน High Sierra และต่อมา 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 ผ่านปัจจุบัน / โมฮาวีBSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024ดังนั้นสำหรับ 48 GiB Mac ของฉันเคอร์เนลจะสงวนหน่วยความจำประมาณ 67 MiB เช่นเดียวกับพื้นที่บัฟเฟอร์สำหรับการตั้งค่ากระบวนการใหม่ที่จะวางไข่ ในอีกด้านหนึ่งนั่นเป็นตัวเลขที่สูงมากแม้แต่กับเว็บเซิร์ฟเวอร์ ในทางตรงกันข้าม 67 MiB เป็นถั่วลิสงเมื่อเทียบกับ 48 GiB บนเครื่อง

ดังนั้นโหมดประสิทธิภาพเซิร์ฟเวอร์จะใช้หน่วยความจำมากขึ้นและทำให้ระบบมีแนวโน้มที่จะประสบปัญหามากขึ้นหากโปรแกรมบางโปรแกรมไม่สามารถควบคุมทรัพยากรที่ใช้ไปได้ ฉันคิดว่า Apple โทรถูกโดยไม่เปิดใช้งานโดยค่าเริ่มต้น แต่ยังทำให้เปิดใช้งานได้ง่าย ฉันดีใจที่มี High Sierra พวกเขากำลังเพิ่มขีด จำกัด ในโหมดปกติหากคุณมีหน่วยความจำเพียงพอ ฉันจะออกจากโหมดเซิร์ฟเวอร์ (และปล่อยให้มันปิด) ในคอมพิวเตอร์ทุกเครื่องของฉันจนกว่าฉันจะสังเกตเห็นพวกเขาทำงานเป็นปัญหาเพราะฉันมีโปรแกรมเซิร์ฟเวอร์จำนวนมากทำงานอยู่ ท้ายที่สุดมันไม่ได้เพิ่มความเร็วของนาฬิการะบบมันจะไม่เพิ่มความเร็วดิสก์และมันก็จะเพิ่มเครือข่าย I / O หากคุณมีการเชื่อมต่อหลายร้อย มี'

ในทางตรงกันข้ามถ้าคุณมีความต้องการที่จะเรียกใช้กระบวนการ 2000 จริง ๆ แล้วโหมดเซิร์ฟเวอร์เป็นตัวเลือกเดียวของคุณจนกว่าคุณจะไปถึงเซียร์รา ข่าวดีก็คือว่ามันง่ายพอที่จะเปิดลองและถ้าคุณไม่ชอบให้ปิดกลับไป


👏🏻! คำแนะนำที่ดีที่ควรทราบใกล้กับข้อสรุป: "ฉันจะออกจากโหมดเซิร์ฟเวอร์ […]"
แดน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.