โหมดประสิทธิภาพของเซิร์ฟเวอร์ (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 จริง ๆ แล้วโหมดเซิร์ฟเวอร์เป็นตัวเลือกเดียวของคุณจนกว่าคุณจะไปถึงเซียร์รา ข่าวดีก็คือว่ามันง่ายพอที่จะเปิดลองและถ้าคุณไม่ชอบให้ปิดกลับไป
sysctl -a
นี่เป็นบทสรุปที่ดีมากของสิ่งต่าง ๆ ที่คุณอาจดูเป็นอันดับแรกถ้าคุณยังใหม่ต่อการปรับแต่งเซิร์ฟเวอร์หรือการปรับเปลี่ยนพารามิเตอร์เคอร์เนล ฉันจะเพิ่ม "ความคิดเห็น" ลงในคำตอบในกรณีที่ช่วยเหลือผู้อื่น โปรดยกเลิกการแก้ไขของฉันหากความคิดเห็นที่แสดงไม่ใช่ของคุณ