×ðÁú¿­Ê±

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷ £¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

1. Åä¾°

ÓÐʱ¼ä»áÓöµ½Ò»Ð©ÒÉÄÑÔÓÖ¢ £¬²¢ÇÒ¼à¿Ø²å¼þ²¢²»¿ÉÒ»ÑÛÁ¢Âí·¢Ã÷ÎÊÌâµÄȪԴ¡£Õâʱ¼ä¾ÍÐèÒªµÇ¼ЧÀÍÆ÷½øÒ»²½ÉîÈëÆÊÎöÎÊÌâµÄȪԴ¡£ÄÇôÆÊÎöÎÊÌâÐèÒªÓÐÒ»¶¨µÄÊÖÒÕÂÄÀú»ýÀÛ £¬²¢ÇÒÓÐЩÎÊÌâÉæ¼°µ½µÄÁìÓòºÜÊǹã £¬²Å»ª¶¨Î»µ½ÎÊÌâ¡£ÒÔÊÇ £¬ÆÊÎöÎÊÌâºÍ²È¿ÓÊǺÜÊÇÄ¥Á¶Ò»Ð¡ÎÒ˽¼ÒµÄÉú³¤ºÍÌáÉý×ÔÎÒÄÜÁ¦¡£ÈôÊÇÎÒÃÇÓÐÒ»Ì׺õÄÆÊÎö¹¤¾ß £¬Äǽ«ÊÇÊ°빦±¶ £¬Äܹ»×ÊÖú¸÷ÈË¿ìËÙ¶¨Î»ÎÊÌâ £¬½ÚÔ¼¸÷ÈËÐí¶àʱ¼ä×ö¸üÉîÈëµÄÊÂÇé¡£

2. ˵Ã÷

±¾ÆªÎÄÕÂÖ÷ÒªÏÈÈÝÖÖÖÖÎÊÌⶨλµÄ¹¤¾ßÒÔ¼°»áÍŽ᰸ÀýÆÊÎöÎÊÌâ¡£

3. ÆÊÎöÎÊÌâµÄÒªÁìÂÛ

Ì×ÓÃ5W2HÒªÁì £¬¿ÉÒÔÌá³öÐÔÄÜÆÊÎöµÄ¼¸¸öÎÊÌâ

What-Õ÷ÏóÊÇʲôÑùµÄ

When-ʲôʱ¼ä±¬·¢

Why-Ϊʲô»á±¬·¢

Where-ÄĸöµØ·½±¬·¢µÄÎÊÌâ

How much-ãýÃðÁ˼¸¶à×ÊÔ´

How to do-Ôõô½â¾öÎÊÌâ

4. cpu

4.1 ˵Ã÷

Õë¶ÔÓ¦ÓóÌÐò £¬ÎÒÃÇͨ³£¹Ø×¢µÄÊÇÄÚºËCPUµ÷ÀíÆ÷¹¦Ð§ºÍÐÔÄÜ¡£

Ï̵߳Ä״̬ÆÊÎöÖ÷ÒªÊÇÆÊÎöÏ̵߳Äʱ¼äÓÃÔÚʲôµØ·½ £¬¶øÏß³Ì״̬µÄ·ÖÀàÒ»Ñùƽ³£·ÖΪ£º

on-CPU£ºÖ´ÐÐÖÐ £¬Ö´ÐÐÖеÄʱ¼äͨ³£ÓÖ·ÖΪÓû§Ì¬Ê±¼äuserºÍϵͳ̬ʱ¼äsys¡£

off-CPU£ºÆÚ´ýÏÂÒ»ÂÖÉÏCPU £¬»òÕßÆÚ´ýI/O¡¢Ëø¡¢»»Ò³µÈµÈ £¬Æä״̬¿ÉÒÔϸ·ÖΪ¿ÉÖ´ÐС¢ÄäÃû»»Ò³¡¢Ë¯Ãß¡¢Ëø¡¢¿ÕÏеÈ״̬¡£

ÈôÊÇ´ó×Úʱ¼ä»¨ÔÚCPUÉÏ £¬¶ÔCPUµÄÆÊÎöÄܹ»Ñ¸ËÙÚ¹ÊÍÔµ¹ÊÔ­ÓÉ £»ÈôÊÇϵͳʱ¼ä´ó×Ú´¦ÓÚoff-cpu״̬ £¬¶¨Î»ÎÊÌâ¾Í»á·ÑʱÐí¶à¡£¿ÉÊÇÈÔÈ»ÐèÒªÇåÎúһЩ¿´·¨£º

´¦Öóͷ£Æ÷

ºË

Ó²¼þÏß³Ì

CPUÄڴ滺´æ

ʱÖÓƵÂÊ

ÿָÁîÖÜÆÚÊýCPIºÍÿÖÜÆÚÖ¸ÁîÊýIPC

CPUÖ¸Áî

ʹÓÃÂÊ

Óû§Ê±¼ä£¯ÄÚºËʱ¼ä

µ÷ÀíÆ÷

ÔËÐÐÐÐÁÐ

ÇÀÕ¼

¶àÀú³Ì

¶àÏß³Ì

×Ö³¤

4.2 ÆÊÎö¹¤¾ß

˵Ã÷:

uptime £¬vmstat £¬mpstat £¬top £¬pidstat Ö»ÄÜÅÌÎʵ½cpu¼°¸ºÔصĵÄʹÓÃÇéÐΡ£

perf¿ÉÒÔËæ×ŵ½Àú³ÌÄÚ²¿Ïêϸº¯ÊýºÄʱÇéÐÎ £¬²¢ÇÒ¿ÉÒÔÖ¸¶¨Äں˺¯Êý¾ÙÐÐͳ¼Æ £¬Ö¸ÄÄ´òÄÄ¡£

4.3 ʹÓ÷½·¨

//Éó²éϵͳcpuʹÓÃÇéÐÎtop
//Éó²éËùÓÐcpuºËÐÅÏ¢mpstat -P ALL 1
//Éó²écpuʹÓÃÇéÐÎÒÔ¼°Æ½¾ù¸ºÔØvmstat 1
//Àú³ÌcpuµÄͳ¼ÆÐÅÏ¢pidstat -u 1 -p pid
//¸ú×ÙÀú³ÌÄÚ²¿º¯Êý¼¶cpuʹÓÃÇéÐÎ perf top -p pid -e cpu-clock

µÇ¼ºó¸´ÖÆ

5. ÄÚ´æ

5.1 ˵Ã÷

ÄÚ´æÊÇΪÌá¸ßЧÂʶøÉú £¬ÏÖʵÆÊÎöÎÊÌâµÄʱ¼ä £¬ÄÚ´æ·ºÆðÎÊÌâ¿ÉÄܲ»µ«ÊÇÓ°ÏìÐÔÄÜ £¬¶øÊÇÓ°ÏìЧÀÍ»òÕßÒýÆðÆäËûÎÊÌ⡣ͬÑù¹ØÓÚÄÚ´æÓÐЩ¿´·¨ÐèÒªÇåÎú£º

Å£±Æ°¡£¡½Ó˽»î±Ø±¸µÄ N ¸ö¿ªÔ´ÏîÄ¿£¡¸ÏæÕä²Ø

µÇ¼ºó¸´ÖÆ

Ö÷´æ

ÐéÄâÄÚ´æ

³£×¤ÄÚ´æ

µØµã¿Õ¼ä

OOM

Ò³»º´æ

ȱҳ

»»Ò³

½»Á÷¿Õ¼ä

½»Á÷

Óû§·ÖÅÉÆ÷libc¡¢glibc¡¢libmallocºÍmtmalloc

LINUXÄں˼¶SLUB·ÖÅÉÆ÷

5.2 ÆÊÎö¹¤¾ß

˵Ã÷£º

free £¬vmstat £¬top £¬pidstat £¬pmapÖ»ÄÜͳ¼ÆÄÚ´æÐÅÏ¢ÒÔ¼°Àú³ÌµÄÄÚ´æʹÓÃÇéÐΡ£

valgrind ¿ÉÒÔÆÊÎöÄÚ´æ×ß©ÎÊÌâ¡£

dtrace ¶¯Ì¬¸ú×Ù¡£ÐèÒª¶ÔÄں˺¯ÊýÓкÜÉîÈëµÄÏàʶ £¬Í¨¹ýDÓïÑÔ±àд¾ç±¾Íê³É¸ú×Ù¡£

5.3 ʹÓ÷½·¨

//Éó²éϵͳÄÚ´æʹÓÃÇéÐÎfree -m//ÐéÄâÄÚ´æͳ¼ÆÐÅÏ¢vmstat 1//Éó²éϵͳÄÚ´æÇéÐÎtop//1sÊÕÂÞÖÜÆÚ£¬»ñÈ¡ÄÚ´æµÄͳ¼ÆÐÅÏ¢pidstat -p pid -r 1//Éó²éÀú³ÌµÄÄÚ´æÓ³ÏñÐÅÏ¢pmap -d pid//¼ì²â³ÌÐòÄÚ´æÎÊÌâvalgrind --tool=memcheck --leak-check=full --log-file=./log.txt  ./³ÌÐòÃû

µÇ¼ºó¸´ÖÆ

6. ´ÅÅÌIO

6.1 ˵Ã÷

´ÅÅÌͨ³£ÊÇÅÌËã»ú×îÂýµÄ×Óϵͳ £¬Ò²ÊÇ×îÈÝÒ×·ºÆðÐÔÄÜÆ¿¾±µÄµØ·½ £¬ÓÉÓÚ´ÅÅÌÀë CPU ¾àÀë×îÔ¶²¢ÇÒ CPU »á¼û´ÅÅÌÒªÉæ¼°µ½»úе²Ù×÷ £¬ºÃ±ÈתÖᡢѰ¹ìµÈ¡£»á¼ûÓ²Å̺ͻá¼ûÄÚ´æÖ®¼äµÄËÙÂʲî±ðÊÇÒÔÊýÄ¿¼¶À´ÅÌËãµÄ £¬¾ÍÏñ1ÌìºÍ1·ÖÖӵIJî±ðÒ»Ñù¡£Òª¼à²â IO ÐÔÄÜ £¬ÓÐÐëÒªÏàʶһÏ»ùÀ´Ô´ÀíºÍ Linux ÊÇÈçÄÇÀïÖÃÓ²Å̺ÍÄÚ´æÖ®¼äµÄ IO µÄ¡£

ÔÚÃ÷È·´ÅÅÌIO֮ǰ £¬Í¬ÑùÎÒÃÇÐèÒªÃ÷ȷһЩ¿´·¨ £¬ÀýÈ磺

Îļþϵͳ

VFS

Îļþϵͳ»º´æ

Ò³»º´æpage cache

»º³åÇø¸ßËÙ»º´æbuffer cache

Ŀ¼»º´æ

inode

inode»º´æ

noopŲÓÃÕ½ÂÔ

6.2 ÆÊÎö¹¤¾ß

6.3 ʹÓ÷½·¨

//Éó²éϵͳioÐÅÏ¢iotop//ͳ¼ÆioÏêϸÐÅÏ¢iostat -d -x -k 1 10//Éó²éÀú³Ì¼¶ioµÄÐÅÏ¢pidstat -d 1 -p  pid//Éó²éϵͳIOµÄÇëÇó£¬ºÃ±È¿ÉÒÔÔÚ·¢Ã÷ϵͳIOÒ쳣ʱ£¬¿ÉÒÔʹÓøÃÏÂÁî¾ÙÐÐÊÓ²ì£¬¾ÍÄÜÖ¸¶¨¾¿¾¹ÊÇʲôԵ¹ÊÔ­Óɵ¼ÖµÄIOÒì³£perf record -e block:block_rq_issue -ag^Cperf report

µÇ¼ºó¸´ÖÆ

7. ÍøÂç

7.1 ˵Ã÷

ÍøÂçµÄ¼à²âÊÇËùÓÐ Linux ×ÓϵͳÄÚÀï×îÖØ´óµÄ £¬ÓÐÌ«¶àµÄÒòËØÔÚÄÚÀï £¬ºÃ±È£ºÑÓ³Ù¡¢ÛÕ±Õ¡¢³åÍ»¡¢¶ª°üµÈ £¬¸üÔãµÄÊÇÓë Linux Ö÷»úÏàÁ¬µÄ·ÓÉÆ÷¡¢½»Á÷»ú¡¢ÎÞÏßÐźŶ¼»áÓ°Ïìµ½ÕûÌåÍøÂç²¢ÇÒºÜÄÑÅжÏÊÇÓÉÓÚ Linux ÍøÂç×ÓϵͳµÄÎÊÌâÕվɱðµÄ×°±¸µÄÎÊÌâ £¬ÔöÌíÁ˼à²âºÍÅжϵÄÖØƯºó¡£ÏÖÔÚÎÒÃÇʹÓõÄËùÓÐÍø¿¨¶¼³ÆΪ×Ô˳ӦÍø¿¨ £¬Òâ˼ÊÇ˵ÄÜƾ֤ÍøÂçÉϵIJî±ðÍøÂç×°±¸µ¼ÖµIJî±ðÍøÂçËÙÂʺÍÊÂÇéģʽ¾ÙÐÐ×Ô¶¯µ÷½â¡£

7.2 ÆÊÎö¹¤¾ß

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

7.3 ʹÓ÷½·¨

//ÏÔʾÍøÂçͳ¼ÆÐÅÏ¢netstat -s//ÏÔʾĿ½ñUDPÅþÁ¬×´Ì¬netstat -nu//ÏÔʾUDP¶Ë¿ÚºÅµÄʹÓÃÇéÐÎnetstat -apu//ͳ¼Æ»úеÖÐÍøÂçÅþÁ¬¸÷¸ö״̬¸öÊýnetstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'//ÏÔʾTCPÅþÁ¬ss -t -a//ÏÔʾsocketsÕªÒªÐÅÏ¢ss -s//ÏÔʾËùÓÐudp socketsss -u -a//tcp,etcp״̬sar -n TCP,ETCP 1//Éó²éÍøÂçIOsar -n DEV 1//×¥°üÒÔ°üΪµ¥Î»¾ÙÐÐÊä³ötcpdump -i eth1 host 192.168.1.1 and port 80 //×¥°üÒÔÁ÷Ϊµ¥Î»ÏÔʾÊý¾ÝÄÚÈÝtcpflow -cp host 192.168.1.1

µÇ¼ºó¸´ÖÆ

8. ϵͳ¸ºÔØ

8.1 ˵Ã÷

Load ¾ÍÊǶÔÅÌËã»ú¸É»î¼¸¶àµÄ»³±§£¨WikiPedia£ºthe system Load is a measure of the amount of work that a compute system is doing£©¼òÆÓµÄ˵ÊÇÀú³ÌÐÐÁеij¤¶È¡£Load Average ¾ÍÊÇÒ»¶Îʱ¼ä£¨1·ÖÖÓ¡¢5·ÖÖÓ¡¢15·ÖÖÓ£©ÄÚƽ¾ùLoad¡£

8.2 ÆÊÎö¹¤¾ß

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

8.3 ʹÓ÷½·¨

//Éó²é¸ºÔØÇéÐÎuptimetopvmstat//ͳ¼ÆϵͳŲÓúÄʱÇéÐÎstrace -c -p pid//¸ú×ÙÖ¸¶¨µÄϵͳ²Ù×÷ÀýÈçepoll_waitstrace -T -e epoll_wait -p pid//Éó²éÄÚºËÈÕÖ¾ÐÅÏ¢dmesg

µÇ¼ºó¸´ÖÆ

9. »ðÑæͼ

9.1 ˵Ã÷

»ðÑæͼ£¨Flame GraphÊÇ Bredan Gregg ½¨ÉèµÄÒ»ÖÖÐÔÄÜÆÊÎöͼ±í £¬ÓÉÓÚËüµÄÑù×Ó½üËÆ ?¶øµÃÃû¡£
»ðÑæͼÖ÷ÒªÊÇÓÃÀ´Õ¹Ê¾ CPUµÄŲÓÃÕ»¡£
y
ÖáÌåÏÖŲÓÃÕ» £¬Ã¿Ò»²ã¶¼ÊÇÒ»¸öº¯Êý¡£Å²ÓÃÕ»Ô½Éî £¬»ðÑæ¾ÍÔ½¸ß £¬¶¥²¿¾ÍÊÇÕýÔÚÖ´Ðеĺ¯Êý £¬Ï·½¶¼ÊÇËüµÄ¸¸º¯Êý¡£
x
ÖáÌåÏÖ³éÑùÊý £¬ÈôÊÇÒ»¸öº¯ÊýÔÚ x ÖáÕ¼ÓеĿí¶ÈÔ½¿í £¬¾ÍÌåÏÖËü±»³éµ½µÄ´ÎÊý¶à £¬¼´Ö´ÐеÄʱ¼ä³¤¡£×¢ÖØ £¬x Öá²»´ú±íʱ¼ä £¬¶øÊÇËùÓеÄŲÓÃÕ»ºÏ²¢ºó £¬°´×Öĸ˳ÐòÅÅÁеÄ¡£
»ðÑæͼ¾ÍÊÇ¿´¶¥²ãµÄÄĸöº¯ÊýÕ¼ÓеĿí¶È×î´ó¡£Ö»ÒªÓС±Æ½¶¥¡±£¨plateaus£© £¬¾ÍÌåÏָú¯Êý¿ÉÄܱ£´æÐÔÄÜÎÊÌâ¡£ÑÕɫûÓÐÌØÊâ¼ÄÒå £¬ÓÉÓÚ»ðÑæͼÌåÏÖµÄÊÇ CPU µÄæµˮƽ £¬ÒÔÊÇÒ»Ñùƽ³£Ñ¡Ôñůɫµ÷¡£

³£¼ûµÄ»ðÑæͼÀàÐÍÓÐ On-CPU¡¢Off-CPU¡¢Memory¡¢Hot/Cold¡¢DifferentialµÈµÈ¡£

9.2 ×°ÖÃÒÀÀµ¿â

//×°ÖÃsystemtap£¬Ä¬ÈÏϵͳÒÑ×°ÖÃyum install systemtap systemtap-runtime//Äں˵÷ÊÔ¿â±ØÐè¸úÄں˰汾¶ÔÓ¦£¬ÀýÈ磺uname -r 2.6.18-308.el5kernel-debuginfo-2.6.18-308.el5.x86_64.rpmkernel-devel-2.6.18-308.el5.x86_64.rpmkernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm//×°ÖÃÄں˵÷ÊÔ¿âdebuginfo-install --enablerepo=debuginfo search kerneldebuginfo-install --enablerepo=debuginfo  search glibc

µÇ¼ºó¸´ÖÆ

9.3 ×°ÖÃ

git clone https://github.com/lidaohang/quick_location.gitcd quick_location

µÇ¼ºó¸´ÖÆ

9.4 CPU¼¶±ð»ðÑæͼ

cpuÕ¼Óùý¸ß £¬»òÕßʹÓÃÂÊÌá²»ÉÏÀ´ £¬ÄãÄÜ¿ìËÙ¶¨Î»µ½´úÂëµÄÄÄ¿éÓÐÎÊÌâÂð£¿

Ò»Ñùƽ³£µÄ×ö·¨¿ÉÄܾÍÊÇͨ¹ýÈÕÖ¾µÈ·½·¨È¥È·¶¨ÎÊÌâ¡£ÏÖÔÚÎÒÃÇÓÐÁË»ðÑæͼ £¬Äܹ»ºÜÊÇÇåÎúµÄ·¢Ã÷Äĸöº¯ÊýÕ¼ÓÃcpu¹ý¸ß £¬»òÕß¹ýµÍµ¼ÖµÄÎÊÌâ¡£ÁíÍâ £¬ËÑË÷¹«ÖÚºÅLinux¾Í¸ÃÕâÑùѧºǫ́»Ø¸´¡°ºï×Ó¡± £¬»ñÈ¡Ò»·Ý¾ªÏ²Àñ°ü¡£

9.4.1 on-CPU

cpuÕ¼Óùý¸ß £¬Ö´ÐÐÖеÄʱ¼äͨ³£ÓÖ·ÖΪÓû§Ì¬Ê±¼äuserºÍϵͳ̬ʱ¼äsys¡£
ʹÓ÷½·¨£º

//on-CPU usersh ngx_on_cpu_u.sh pid//½øÈëЧ¹ûĿ¼ cd ngx_on_cpu_u//on-CPU kernelsh ngx_on_cpu_k.sh pid//½øÈëЧ¹ûĿ¼ cd ngx_on_cpu_k//¿ªÒ»¸öÔÝʱ¶Ë¿Ú 8088 python -m SimpleHTTPServer 8088//·­¿ªä¯ÀÀÆ÷ÊäÈëµØµã127.0.0.1:8088/pid.svg

µÇ¼ºó¸´ÖÆ

DEMO£º

µÇ¼ºó¸´ÖÆ

#include <stdio.h>#include <stdlib.h>
void foo3(){  }
void foo2(){    int i;    for(i=0 ; i < 10; i++)           foo3();}
void foo1(){    int i;  for(i = 0; i< 1000; i++)      foo3();}
int main(void){    int i;    for( i =0; i< 1000000000; i++) {          foo1();          foo2();    }}

µÇ¼ºó¸´ÖÆ

DEMO»ðÑæͼ£º

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

9.4.2 off-CPU

cpu¹ýµÍ £¬Ê¹ÓÃÂʲ»¸ß¡£ÆÚ´ýÏÂÒ»ÂÖCPU £¬»òÕßÆÚ´ýI/O¡¢Ëø¡¢»»Ò³µÈµÈ £¬Æä״̬¿ÉÒÔϸ·ÖΪ¿ÉÖ´ÐС¢ÄäÃû»»Ò³¡¢Ë¯Ãß¡¢Ëø¡¢¿ÕÏеÈ״̬¡£

ʹÓ÷½·¨£º

// off-CPU usersh ngx_off_cpu_u.sh pid//½øÈëЧ¹ûĿ¼cd ngx_off_cpu_u//off-CPU kernelsh ngx_off_cpu_k.sh pid//½øÈëЧ¹ûĿ¼cd ngx_off_cpu_k//¿ªÒ»¸öÔÝʱ¶Ë¿Ú8088python -m SimpleHTTPServer 8088//·­¿ªä¯ÀÀÆ÷ÊäÈëµØµã127.0.0.1:8088/pid.svg

µÇ¼ºó¸´ÖÆ

¹ÙÍøDEMO£º

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

9.5 Äڴ漶±ð»ðÑæͼ

ÈôÊÇÏßÉϳÌÐò·ºÆðÁËÄÚ´æ×ß© £¬²¢ÇÒÖ»ÔÚÌض¨µÄ³¡¾°²Å»á·ºÆð¡£Õâ¸öʱ¼äÎÒÃÇÔõô°ìÄØ£¿ÓÐʲôºÃµÄ·½·¨ºÍ¹¤¾ßÄÜ¿ìËٵķ¢Ã÷´úÂëµÄÎÊÌâÄØ£¿Í¬ÑùÄڴ漶±ð»ðÑæͼ°ïÄã¿ìËÙÆÊÎöÎÊÌâµÄȪԴ¡£

ʹÓ÷½·¨£º

sh ngx_on_memory.sh pid//½øÈëЧ¹ûĿ¼cd ngx_on_memory//¿ªÒ»¸öÔÝʱ¶Ë¿Ú8088python -m SimpleHTTPServer 8088//·­¿ªä¯ÀÀÆ÷ÊäÈëµØµã127.0.0.1:8088/pid.svg

µÇ¼ºó¸´ÖÆ

¹ÙÍøDEMO£º

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

9.6 ÐÔÄÜ»ØÍË-ºìÀ¶²î·Ö»ðÑæͼ

ÄãÄÜ¿ìËÙ¶¨Î»CPUÐÔÄÜ»ØÍ˵ÄÎÊÌâô£¿ÈôÊÇÄãµÄÊÂÇéÇéÐκÜÊÇÖØ´óÇÒת±ä¿ìËÙ £¬ÄÇôʹÓÃÏÖÓеŤ¾ßÊÇÀ´¶¨Î»ÕâÀàÎÊÌâÊǺܾßÓÐÌôÕ½ÐԵġ£µ±Ä㻨µôÊýÖÜʱ¼ä°Ñ¸ùÒòÕÒµ½Ê± £¬´úÂëÒѾ­Óֱ任Á˺ü¸ÂÖ £¬ÐµÄÐÔÄÜÎÊÌâÓÖðÁ˳öÀ´¡£Ö÷Òª¿ÉÒÔÓõ½Ã¿´Î¹¹½¨ÖÐ £¬Ã¿´ÎÉÏÏß×ö±ÈÕÕ¿´ £¬ÈôÊÇËðʧÑÏÖØ¿ÉÒÔÁ¢Âí½â¾öÐÞ¸´¡£

ͨ¹ýץȡÁËÁ½ÕÅͨË׵ĻðÑæͼ £¬È»ºó¾ÙÐбÈÕÕ £¬²¢¶Ô²î±ð²¿·Ö¾ÙÐбêÉ«£ººìÉ«ÌåÏÖÉÏÉý £¬À¶É«ÌåÏÖϽµ¡£²î·Ö»ðÑæͼÊÇÒÔÄ¿½ñ£¨¡°Ð޸ĺ󡱣©µÄprofileÎļþ×÷Ϊ»ù×¼ £¬ÐÎ×´ºÍ¾Þϸ¶¼¼á³ÖÎȹÌ¡£Òò´ËÄãͨ¹ýÉ«²ÊµÄ²î±ð¾ÍÄܹ»ºÜÖ±¹ÛµÄÕÒµ½²î±ð²¿·Ö £¬ÇÒ¿ÉÒÔ¿´³öΪʲô»áÓÐÕâÑùµÄ²î±ð¡£

ʹÓ÷½·¨£º

cd quick_location//ץȡ´úÂëÐÞ¸ÄÇ°µÄprofile 1Îļþperf record -F 99 -p pid -g -- sleep 30perf script > out.stacks1//ץȡ´úÂëÐ޸ĺóµÄprofile 2Îļþperf record -F 99 -p pid -g -- sleep 30perf script > out.stacks2//ÌìÉú²î·Ö»ðÑæͼ:./FlameGraph/stackcollapse-perf.pl ../out.stacks1 > out.folded1./FlameGraph/stackcollapse-perf.pl ../out.stacks2 > out.folded2./FlameGraph/difffolded.pl out.folded1 out.folded2 | ./FlameGraph/flamegraph.pl > diff2.svg

µÇ¼ºó¸´ÖÆ

DEMO£º

//test.c#include <stdio.h>#include <stdlib.h>
void foo3(){  }
void foo2(){    int i;    for(i=0 ; i < 10; i++)      foo3();}
void foo1(){    int i;    for(i = 0; i< 1000; i++)       foo3();}
int main(void){    int i;  for( i =0; i< 1000000000; i++) {      foo1();      foo2();    }}
//test1.c#include <stdio.h>#include <stdlib.h>
void foo3(){
}
void foo2(){  int i;  for(i=0 ; i < 10; i++)         foo3();}
void foo1(){    int i;    for(i = 0; i< 1000; i++)         foo3();}
void add(){    int i;    for(i = 0; i< 10000; i++)       foo3();}
int main(void){    int i;    for( i =0; i< 1000000000; i++) {    foo1();    foo2();    add();  }}

µÇ¼ºó¸´ÖÆ

DEMOºìÀ¶²î·Ö»ðÑæͼ£º

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

10. °¸ÀýÆÊÎö

10.1 ½ÓÈë²ãnginx¼¯ÈºÒì³£Õ÷Ïó

ͨ¹ý¼à¿Ø²å¼þ·¢Ã÷ÔÚ 2017.09.25 19 µãnginx¼¯ÈºÇëÇóÁ÷Á¿·ºÆð´ó×ÚµÄ499 £¬5xx״̬Âë¡£²¢ÇÒ·¢Ã÷»úеcpuʹÓÃÂÊÉý¸ß £¬ÏÖÔÚÒ»Ö±Ò»Á¬ÖС£ÁíÍâ £¬ËÑË÷¹«ÖںŶ¥¼¶Ëã·¨ºǫ́»Ø¸´¡°Ëã·¨¡± £¬»ñÈ¡Ò»·Ý¾ªÏ²Àñ°ü¡£

10.2 ÆÊÎönginxÏà¹ØÖ¸±ê

a) **ÆÊÎönginxÇëÇóÁ÷Á¿£º

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

½áÂÛ£º

ͨ¹ýÉÏͼ·¢Ã÷Á÷Á¿²¢Ã»ÓÐÍ»Ôö £¬·´¶øϽµÁË £¬¸úÇëÇóÁ÷Á¿Í»Ôöû¹Øϵ¡£

b) **ÆÊÎönginxÏìӦʱ¼ä

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

½áÂÛ£º

ͨ¹ýÉÏͼ·¢Ã÷nginxµÄÏìӦʱ¼äÓÐÔöÌí¿ÉÄܸúnginx×ÔÉíÓйØϵ»òÕ߸úºó¶ËupstreamÏìӦʱ¼äÓйØϵ¡£

c) **ÆÊÎönginx upstreamÏìӦʱ¼ä

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

½áÂÛ£º

ͨ¹ýÉÏͼ·¢Ã÷nginx upstream ÏìӦʱ¼äÓÐÔöÌí £¬ÏÖÔÚÍƲâ¿ÉÄܺó¶ËupstreamÏìӦʱ¼äÍÏסnginx £¬µ¼ÖÂnginx·ºÆðÇëÇóÁ÷Á¿Òì³£¡£

10.3 ÆÊÎöϵͳcpuÇéÐÎ

a) **ͨ¹ýtopÊÓ²ìϵͳָ±ê

top

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

½áÂÛ£º

·¢Ã÷nginx worker cpu½ÏÁ¿¸ß

b) **ÆÊÎönginxÀú³ÌÄÚ²¿cpuÇéÐÎ

perf top -p pid

½áÂÛ£º

·¢Ã÷Ö÷Òª¿ªÏúÔÚfree,malloc,jsonÆÊÎöÉÏÃæ

10.4 »ðÑæͼÆÊÎöcpu

a) **ÌìÉúÓû§Ì¬cpu»ðÑæͼ

//on-CPU usersh ngx_on_cpu_u.sh pid//½øÈëЧ¹ûĿ¼cd ngx_on_cpu_u//¿ªÒ»¸öÔÝʱ¶Ë¿Ú8088python -m SimpleHTTPServer 8088//·­¿ªä¯ÀÀÆ÷ÊäÈëµØµã127.0.0.1:8088/pid.svg

µÇ¼ºó¸´ÖÆ

Linux ÔËά¹ÊÕÏÅŲé˼Ð÷£¬ÓÐÕâƪÎÄÕ¾͹»ÁË~

½áÂÛ£º

·¢Ã÷´úÂëÄÚÀïÓÐƵÈÔµÄÆÊÎöjson²Ù×÷ £¬²¢ÇÒ·¢Ã÷Õâ¸öjson¿âÐÔÄܲ»¸ß £¬Õ¼ÓÃcpuͦ¸ß¡£

10.5 °¸Àý×ܽá

a) ÆÊÎöÇëÇóÁ÷Á¿Òì³£ £¬µÃ³önginx upstreamºó¶Ë»úеÏìӦʱ¼äÀ­³¤

b) ÆÊÎönginxÀú³Ìcpu¸ß £¬µÃ³önginxÄÚ²¿Ä£¿é´úÂëÓкÄʱµÄjsonÆÊÎöÒÔ¼°ÄÚ´æ·ÖÅɽÓÄɲÙ×÷

10.5.1 ÉîÈëÆÊÎö

ƾ֤ÒÔÉÏÁ½µãÎÊÌâÆÊÎöµÄ½áÂÛ £¬ÎÒÃǽøÒ»²½ÉîÈëÆÊÎö¡£

ºó¶ËupstreamÏìÓ¦À­³¤ £¬×î¶à¿ÉÄÜÓ°ÏìnginxµÄ´¦Öóͷ£ÄÜÁ¦¡£¿ÉÊDz»¿ÉÄÜ»áÓ°ÏìnginxÄÚ²¿Ä£¿éÕ¼Óùý¶àµÄcpu²Ù×÷¡£²¢ÇÒÆäʱռÓÃcpu¸ßµÄÄ£¿é £¬ÊÇÔÚÇëÇóµÄʱ¼ä²Å»á×ßµÄÂß¼­¡£²»Ì«¿ÉÄÜÊÇupstramºó¶ËÍÏסnginx £¬´Ó¶ø´¥·¢Õâ¸öcpuµÄºÄʱ²Ù×÷¡£

10.5.2 ½â¾ö·½·¨

Óöµ½ÕâÖÖÎÊÌâ £¬ÎÒÃÇÓÅÏȽâ¾öÒÑÖªµÄ £¬²¢ÇÒºÜÊÇÃ÷È·µÄÎÊÌâ¡£ÄǾÍÊÇcpu¸ßµÄÎÊÌâ¡£½â¾ö·½·¨ÏȽµ¼¶¹Ø±ÕÕ¼ÓÃcpu¹ý¸ßµÄÄ£¿é £¬È»ºó¾ÙÐÐÊӲ졣¾­Óɽµ¼¶¹Ø±Õ¸ÃÄ£¿écpu½µÏÂÀ´ÁË £¬²¢ÇÒnginxÇëÇóÁ÷Á¿Ò²Õý³£ÁË¡£Ö®ÒÔÊÇ»áÓ°Ïìupstreamʱ¼äÀ­³¤ £¬ÓÉÓÚupstreamºó¶ËµÄЧÀÍŲÓõĽӿڿÉÄÜÊǸö»·Â·ÔÙ´Î×߻ص½nginx¡£

11.²Î¿¼×ÊÁÏ

http://www.brendangregg.com/index.html

http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html

http://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html

http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html

http://www.brendangregg.com/blog/2014-11-09/differential-flame-graphs.html

https://github.com/openresty/openresty-systemtap-toolkit

https://github.com/brendangregg/FlameGraph

https://www.slideshare.net/brendangregg/blazing-performance-with-flame-graphs

ÒÔÉϾÍÊÇLinux ÔËά¹ÊÕÏÅŲé˼Ð÷ £¬ÓÐÕâƪÎÄÕ¾͹»ÁË~µÄÏêϸÄÚÈÝ £¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡

ÃâÔð˵Ã÷£ºÒÔÉÏչʾÄÚÈÝȪԴÓÚÏàÖúýÌå¡¢ÆóÒµ»ú¹¹¡¢ÍøÓÑÌṩ»òÍøÂçÍøÂçÕûÀí £¬°æȨÕùÒéÓë±¾Õ¾ÎÞ¹Ø £¬ÎÄÕÂÉæ¼°¿´·¨Óë¿´·¨²»´ú±í×ðÁú¿­Ê±ÂËÓÍ»úÍø¹Ù·½Ì¬¶È £¬Çë¶ÁÕß½ö×ö²Î¿¼¡£±¾ÎĽӴýתÔØ £¬×ªÔØÇë˵Ã÷À´ÓÉ¡£ÈôÄúÒÔΪ±¾ÎÄÇÖÕ¼ÁËÄúµÄ°æȨÐÅÏ¢ £¬»òÄú·¢Ã÷¸ÃÄÚÈÝÓÐÈκÎÉæ¼°ÓÐÎ¥¹«µÂ¡¢Ã°·¸Ö´·¨µÈÎ¥·¨ÐÅÏ¢ £¬ÇëÄúÁ¬Ã¦ÁªÏµ×ðÁú¿­Ê±ÊµÊ±ÐÞÕý»òɾ³ý¡£

Ïà¹ØÐÂÎÅ

ÁªÏµ×ðÁú¿­Ê±

18523999891

¿É΢ÐÅÔÚÏß×Éѯ

ÊÂÇéʱ¼ä£ºÖÜÒ»ÖÁÖÜÎå £¬9:30-18:30 £¬½ÚãåÈÕÐÝÏ¢

QR code
¡¾ÍøÕ¾µØͼ¡¿¡¾sitemap¡¿