ͨ¹ýϸÖµÄCPUÅäÖã¬Äã¿ÉÒÔÏÔÖøÌáÉýϵͳÐÔÄÜ£¬ÓÅ»¯½ø³Ìµ÷¶È£¬²¢×î´óÏ޶ȵØÀûÓÃÓ²¼þ×ÊÔ´
±¾ÎĽ«ÉîÈë̽ÌÖLinuxϵͳÖеÄCPUÉèÖ㬺¸ÇCPUÇ׺ÍÁ¦¡¢µ÷¶ÈÆ÷ÓÅ»¯¡¢ÐÔÄܵ÷Óż¼Çɵȷ½Ã棬°ïÖú¶ÁÕßÕÆÎÕÈçºÎͨ¹ýµ÷ÕûCPUÉèÖÃÀ´ÌáÉýϵͳÕûÌåÐÔÄÜ
Ò»¡¢CPUÇ׺ÍÁ¦£º°ó¶¨½ø³ÌÓëCPU CPUÇ׺ÍÁ¦£¨CPU Affinity£©ÊÇÒ»ÖÖ½«½ø³Ì£¨»òỊ̈߳©°ó¶¨µ½Ìض¨CPUºËÐÄÉϵļ¼Êõ
ÕâÖְ󶨻úÖÆÓÐÖúÓÚÌáÉýcacheÃüÖÐÂÊ£¬¼õÉÙCPU»º´æÊ§Ð§´øÀ´µÄÐÔÄÜËðºÄ£¬²¢ÓÅ»¯ÏµÍ³×ÊÔ´·ÖÅä
1. ÈíÇ׺ÍÁ¦ÓëÓ²Ç׺ÍÁ¦ ÔÚLinuxϵͳÖУ¬CPUÇ׺ÍÁ¦·ÖΪÈíÇ׺ÍÁ¦ºÍÓ²Ç׺ÍÁ¦Á½ÖÖ
ÈíÇ׺ÍÁ¦ÊÇÖ¸µ÷¶ÈÆ÷ÇãÏòÓÚ½«½ø³Ìµ÷¶Èµ½Í¬Ò»CPUÉÏÔËÐУ¬µ«²¢·ÇÇ¿ÖÆ°ó¶¨
ÕâÖÖ»úÖÆÓÐÖúÓÚ¼õÉÙ½ø³ÌÇ¨ÒÆ´øÀ´µÄ»º´æÊ§Ð§£¬Í¬Ê±±£³Ö´¦ÀíÆ÷¸ºÔصĻù±¾Æ½ºâ
µ±ÏµÍ³¸ºÔز»Æ½ºâʱ£¬µ÷¶ÈÆ÷²Å»á¿¼Âǽ«½ø³ÌÇ¨ÒÆµ½ÆäËûCPUÉÏ
Ó²Ç׺ÍÁ¦ÔòÊÇÖ¸½«½ø³ÌÇ¿ÖÆ°ó¶¨µ½Ìض¨CPUÉÏÔËÐÐ
ÕâÖÖ»úÖÆÍ¨³£ÓÃÓÚ¶Ô»º´æÃô¸ÐµÄÓ¦Óó¡¾°£¬ÈçÄÚ´æÃܼ¯Ðͽø³Ì£¬ÒÔÈ·±£½ø³ÌÄܹ»ÔÚͬһCPUÉÏÔËÐУ¬´Ó¶øÌá¸ßcacheÃüÖÐÂÊ
LinuxϵͳÌṩÁË`sched_setaffinity()`ºÍ`sched_getaffinity()`ϵͳµ÷ÓÃÀ´ÉèÖúͻñÈ¡½ø³ÌµÄÓ²Ç׺ÍÁ¦
2. ʹÓÃtasksetÉèÖÃCPUÇ׺ÍÁ¦ `taskset`ÊÇÒ»¸öÃüÁîÐй¤¾ß£¬ÓÃÓÚÉèÖûò¼ìË÷½ø³ÌµÄCPUÇ׺ÍÁ¦
ͨ¹ýÖ¸¶¨½ø³ÌµÄPID£¬`taskset`¿ÉÒÔÐÞ¸ÄÆäµ±Ç°µÄCPUÇ׺ÍÁ¦
´ËÍ⣬Ä㻹¿ÉÒÔʹÓÃ`taskset`ÔÚÆô¶¯Ð½ø³Ìʱָ¶¨ÆäCPUÇ׺ÍÁ¦
CPUÇ׺ÍÁ¦ÒÔÊ®Áù½øÖƵÄλÑÚÂë±íʾ£¬×îµÍλ¶ÔÓ¦µÚÒ»¸öÂß¼CPU£¬×î¸ßλ¶ÔÓ¦×îºóÒ»¸öÂß¼CPU
ÀýÈ磬Ҫ½«ÕýÔÚÔËÐеĽø³Ì°ó¶¨µ½CPU1ÉÏÔËÐУ¬¿ÉÒÔʹÓÃÒÔÏÂÃüÁ
taskset -p 0x2 ͨ¹ýcgroup£¬Äã¿ÉÒÔÏÞÖÆ½ø³ÌÔÚÌØ¶¨cpuÉÏÔËÐУ¬´Ó¶øÓÅ»¯ÏµÍ³×ÊÔ´·ÖÅä ="" ÔÚcpuset="" cgroupÖУ¬Äã¿ÉÒÔÉèÖÃ`cpuset.cpus`²ÎÊýÀ´Ö¸¶¨½ø³Ì¿ÉÒÔʹÓõÄcpu·¶Î§ ÀýÈ磬Ҫ½«½ø³ÌÏÞÖÆÔÚcpu0ºÍcpu2ÉÏÔËÐУ¬¿ÉÒÔÉèÖÃ`cpuset.cpus`Ϊ`0,2` ´ËÍ⣬Ä㻹¿ÉÒÔʹÓÃ`cpuset.mems`²ÎÊýÀ´Ö¸¶¨½ø³Ì¿ÉÒÔʹÓõÄnumaÄÚ´æÇøÓò ="" ¶þ¡¢cpuµ÷¶ÈÆ÷ÓÅ»¯£ºÑ¡ÔñºÏÊʵĵ÷¶È²ßÂÔ="" linuxϵͳÌṩÁ˶àÖÖcpuµ÷¶ÈÆ÷£¬Èçcfs£¨completely="" fair="" scheduler£¬ÍêÈ«¹«Æ½µ÷¶ÈÆ÷£©¡¢bfs£¨brain="" fuck="" scheduler£¬Ò»ÖÖÇáÁ¿¼¶¡¢µÍÑӳٵĵ÷¶ÈÆ÷£©µÈ Ñ¡ÔñºÏÊʵĵ÷¶ÈÆ÷¶ÔÓÚÓÅ»¯ÏµÍ³ÐÔÄÜÖÁ¹ØÖØÒª ="" 1.="" cfsµ÷¶ÈÆ÷="" cfsÊÇlinuxϵͳÖеÄĬÈϵ÷¶ÈÆ÷£¬ËüÖ¼ÔÚÌṩ¹«Æ½µÄcpuʱ¼ä·ÖÅ䣬ȷ±£ËùÓнø³Ì¶¼ÄÜ»ñµÃÏàÓ¦µÄcpu×ÊÔ´ cfsµ÷¶ÈÆ÷ͨ¹ýά»¤Ò»¸öºìºÚÊ÷À´¸ú×Ù¿ÉÔËÐнø³Ì£¬²¢¸ù¾Ý½ø³ÌµÄÐéÄâÔËÐÐʱ¼ä£¨vruntime£©À´µ÷¶È½ø³Ì ="" cfsµ÷¶ÈÆ÷ÊÊÓÃÓÚ´ó¶àÊýÓ¦Óó¡¾°£¬µ«ÔÚijЩ¶ÔÑÓ³ÙÃô¸ÐµÄ³¡¾°Ï¿ÉÄܱíÏÖ²»¼Ñ ÀýÈ磬ÔÚʵʱϵͳÖУ¬cfsµ÷¶ÈÆ÷¿ÉÄÜÎÞ·¨Âú×ãÑϸñµÄÏìӦʱ¼äÒªÇó ="" 2.="" bfsµ÷¶ÈÆ÷="" bfsÊÇÒ»ÖÖÇáÁ¿¼¶¡¢µÍÑӳٵĵ÷¶ÈÆ÷£¬Ö¼ÔÚÌṩ¸ü¿ìµÄÉÏÏÂÎÄÇл»ºÍ¸üµÍµÄµ÷¶ÈÑÓ³Ù ÓëcfsÏà±È£¬bfs¸üÊʺ϶ÔÑÓ³ÙÃô¸ÐµÄÓ¦Óó¡¾°£¬Èçʵʱϵͳ¡¢ÓÎÏ··þÎñÆ÷µÈ ="" È»¶ø£¬bfsµ÷¶ÈÆ÷ÔÚijЩ³¡¾°Ï¿ÉÄܲ»Èçcfs¹«Æ½ Òò´Ë£¬ÔÚÑ¡Ôñµ÷¶ÈÆ÷ʱ£¬ÐèÒª¸ù¾Ý¾ßÌåÓ¦Óó¡¾°½øÐÐȨºâ ="" Èý¡¢linuxϵͳÐÔÄܵ÷Óż¼ÇÉ="" ³ýÁËcpuÇ׺ÍÁ¦ºÍµ÷¶ÈÆ÷ÓÅ»¯Í⣬linuxϵͳ»¹ÌṩÁ˶àÖÖÐÔÄܵ÷Óż¼ÇÉ£¬ÒÔ½øÒ»²½ÌáÉýϵͳÐÔÄÜ ="" cpuƵÂʵ÷Õû="" ʹÓÃ`cpufreq`¹¤¾ß¿ÉÒÔµ÷ÕûcpuƵÂʺ͹¦ºÄ²ßÂÔ ÀýÈ磬¿ÉÒÔÑ¡Ôñ`performance`ģʽÒÔÈ·±£cpuÒÔ×î¸ßƵÂÊÔËÐУ¬´Ó¶øÌáÉýϵͳÐÔÄÜ£»Ò²¿ÉÒÔÑ¡Ôñ`powersave`ģʽÀ´½µµÍ¹¦ºÄ£¬ÑÓ³¤µç³ØÐøº½Ê±¼ä ="" ÐéÄâÄÚ´æ¹ÜÀí="" ͨ¹ýµ÷Õû`="" proc="" sys="" vm="" swappiness`²ÎÊý¿ÉÒÔ¿ØÖÆÏµÍ³Ê¹ÓÃswapµÄÇãÏò ½µµÍ¸ÃÖµ¿ÉÒÔ¼õÉÙϵͳ¶ÔswapµÄÒÀÀµ£¬´Ó¶øÌá¸ßϵͳÐÔÄÜ ="" Äڴ滺´æÇåÀí="" ʹÓÃ`echo="" 3=""> /proc/sys/vm/drop_caches`ÃüÁî¿ÉÒÔÇåÀíÒ³Ãæ»º´æ¡¢Ä¿Â¼Ï´æºÍinode»º´æ£¬ÊÍ·ÅÄÚ´æ×ÊÔ´ ÕâÓÐÖúÓÚÔÚÄÚ´æ½ôÕŵÄÇé¿öÏÂÌáÉýϵͳÐÔÄÜ
4. I/Oµ÷¶ÈÆ÷ÓÅ»¯
LinuxϵͳÌṩÁ˶àÖÖI/Oµ÷¶ÈÆ÷£¬Èçnoop¡¢deadline¡¢cfqµÈ ͨ¹ýµ÷Õû`/sys/block/¡¾device¡¿/queue/scheduler`²ÎÊý¿ÉÒÔÑ¡ÔñÊʺϹ¤×÷¸ºÔصÄI/Oµ÷¶ÈÆ÷ ÀýÈ磬¶ÔÓÚSSDµÈ¸ßÐÔÄÜ´æ´¢É豸£¬¿ÉÒÔÑ¡Ôñnoopµ÷¶ÈÆ÷ÒÔ¼õÉÙI/OÑÓ³Ù
5. Îļþϵͳ¹ÒÔØÑ¡ÏîÓÅ»¯
ʹÓúÏÊʵĹÒÔØÑ¡ÏîÈç`noatime`¿ÉÒÔ¼õÉÙ´ÅÅÌI/O²Ù×÷£¬ÌáÉýÎļþϵͳÐÔÄÜ ´ËÍ⣬¶¨ÆÚʹÓÃ`fsck`¼ì²éÎļþϵͳµÄÍêÕûÐÔ¿ÉÒÔ±ÜÃâ´ÅÅÌ´íÎóµ¼ÖµÄÐÔÄÜϽµ
6. TCPµ÷ÓÅ
µ÷Õû`/proc/sys/net/ipv4/tcp_rmem`ºÍ`/proc/sys/net/ipv4/tcp_wmem`²ÎÊý¿ÉÒÔÓÅ»¯TCP»º³åÇø´óС£¬¸ù¾ÝÍøÂçÇé¿öµ÷Õû´°¿Ú´óСÒÔÌáÉýÍøÂçÐÔÄÜ
7. Äں˲ÎÊýµ÷ÓÅ
ʹÓÃ`sysctl`¹¤¾ß¿ÉÒÔµ÷ÕûÄں˲ÎÊýÒÔÓÅ»¯ÏµÍ³ÐÔÄÜ ÀýÈ磬µ÷Õû`net.core.somaxconn`ºÍ`net.ipv4.tcp_max_syn_backlog`²ÎÊý¿ÉÒÔÌáÉýÁ¬½Ó´¦ÀíÄÜÁ¦£»µ÷Õû`vm.overcommit_memory`ºÍ`vm.dirty_ratio`²ÎÊý¿ÉÒÔÓÅ»¯ÏµÍ³µÄÄÚ´æºÍI/OÐÐΪ
8. ×Ô¶¨Òå±àÒëÄÚºË
ͨ¹ý×Ô¶¨Òå±àÒëÄں˲¢È¥µô²»±ØÒªµÄÄ£¿é£¬¿ÉÒÔ¼õÉÙÄÚºËÌå»ý²¢Ìá¸ßϵͳÆô¶¯ËٶȺÍÔËÐÐЧÂÊ ´ËÍ⣬»¹¿ÉÒÔ¸ù¾Ý¾ßÌåÓ¦Óó¡¾°µ÷ÕûÄÚºËÅäÖÃÑ¡ÏîÒÔÓÅ»¯ÏµÍ³ÐÔÄÜ
9. ÐéÄâ»úÓëÈÝÆ÷µ÷ÓÅ
ÔÚÐéÄâ»ú»·¾³ÖУ¬¿ÉÒÔͨ¹ýÉèÖÃÐéÄâ»úµÄCPUÇ׺ÍÁ¦À´ÓÅ»¯CPU×ÊÔ´·ÖÅä ÔÚDocker»òKubernetesµÈÈÝÆ÷»·¾³ÖУ¬¿ÉÒÔµ÷ÕûÈÝÆ÷µÄ×ÊÔ´ÏÞÖÆ£¨ÈçCPUºÍÄÚ´æÏÞÖÆ£©²¢ÓÅ»¯ÈÝÆ÷ÍøÂçÉèÖÃÒÔÌáÉýÈÝÆ÷ÐÔÄÜ
ËÄ¡¢½áÂÛ
×ÛÉÏËùÊö£¬LinuxϵͳÖеÄCPUÉèÖÃÊÇÓÅ»¯ÏµÍ³ÐÔÄܺÍ×ÊÔ´¹ÜÀíµÄÖØÒªÊֶΠͨ¹ýºÏÀíÅäÖÃCPUÇ׺ÍÁ¦¡¢Ñ¡ÔñÊʺϵĵ÷¶ÈÆ÷ÒÔ¼°ÔËÓöàÖÖÐÔÄܵ÷Óż¼ÇÉ£¬¿ÉÒÔÏÔÖøÌáÉýϵͳÐÔÄܲ¢Âú×ã¸÷ÖÖÓ¦Óó¡¾°µÄÐèÇó ÎÞÂÛÊǶÔÓÚ·þÎñÆ÷¡¢×ÀÃæÏµÍ³»¹ÊÇǶÈëʽÉ豸¶øÑÔ£¬LinuxϵͳµÄCPUÉèÖö¼·¢»Ó×ÅÖÁ¹ØÖØÒªµÄ×÷ÓÃ