linuxIndicatorsmonitoringnote刚开始负责生产环境的部署,在线上环境遇到了一些内存和CPU的问题。由于微服务和容器的流行,现在很容易使用K8s+prometheus+grafana+alert进行监控,足以覆盖大部分场景。最重要的事情已经交给了最合适的组件。但是了解裸机上的一些命令和指标也是必不可少的:知道监控什么指标,平时写一些脚本,经常会导致OOM或者CPU占用率高。一张linuxperf的图作为大纲,我试着整理了一些指标,以备不时之需。原文地址:linux监控各种指标注意事项·GitHub系列文章:服务器运维注意事项·githubhtop/tophtop足以覆盖大部分指标,具体可以直接查看帮助。这里的TIME是指CPU时间,htop中的任务号是指进程树,top中的任务号是指进程树+内核线程号,参考文章https://www.cnblogs.com/arnol...排序:按内存/CPU/状态。按进程状态排序也很重要,尤其是当平均负载过高时。按内存和CPU使用率排序以定位高资源占用者。filterfieldsprocess/count...CPU基本信息是linux中的所有文件,查看/proc/cpuinfo查看信息。另外一个衍生问题就是怎么查看CPU个数,怎么查看CPU型号,怎么查看CPU的主频,cat/proc/cpuinfocat/proc/statloadaverage(平均负载)可以打印出系统中的过去1、5、15分钟使用正常运行时间和w平均负载。此外,您可以使用sar-q查看动态平均负载。$uptime19:28:49up290days,20:25,1user,loadaverage:2.39,2.64,1.55$w19:29:50up290days,20:26,1user,loadaverage:2.58,2.63,1.61USERTTYFROMLOGIN@IDLEJCPUPCPUWHATrootpts/0172.16.0.119:276.00s0.05s0.00stmuxa解释平均负载Systemloadaverages是正常运行时间手册中的平均进程数处于可运行或不可中断状态。翻译过来就是指系统中处于可运行状态和不可中断状态的平均进程数。对于4核CPU,如果平均负载高于4,说明负载过高动态平均负载$sar-q1100Linux3.10.0-957.21.3.el7.x86_64(shanyue)10/21/19_x86_64_(2CPU)16:55:52runq-szplist-szldavg-1ldavg-5ldavg-15blocked16:55:5304640.070.110.13016:55:5404640.060.100.13016:55:5504640.060.13016:55:5604640.060.100.13016:55:5704640.060.100.13016:55:5704640.060.100.130Average:04640.060.100.06使用CPU检查命令h直接使用。idlecpu时间也可以通过topCPUutilization=1-cpu-idle-time/cpu-time$top%Cpu(s):7.4us,2.3sy,0.0ni,90.1id,0.0wa,0.0hi直接显示,0.2si,0.0stuuser:用户模式,但不包括nicesystem:内核模式nice:低优先级用户模式,CPUtimeidlewithnicevalue1-19(id)iowait(wa)irq(hi)softirq(si)steal(st)systemcallstrace查看系统调用-p指定pid-c统计每次系统调用被调用的次数和CPU时间#用来查看一个process使用的系统调用#-p:指定进程号7477$strace-p7477#用于查看某个命令需要的系统调用$stracecatindex.js#统计系统调用$strace-p7477-cMemoryfree用于查看系统内存如果要查看进程内存,使用pidstat-r或者htop$free-htotalusedfreesharedbuff/cacheavailableMem:3.7G682M398M2.1M2.6G2.7GSwap:0B0B0Bprocessderivativequestion如何找到进程根据命令名howto根据参数如何获取进程状态如何获取进程的CPU使用率如何获取进程的内存使用率#查看122PID进程$ps122#根据命令名$pgrep-anode26464node/code/node_modules/.bin/ts-nodeindex.ts30549nodeserver.js#根据命令名和参数找到PID$pgrep-afts-node26464node/code/node_modules/.bin/ts-nodeindex.ts#查看122个PID进程信息$cat/proc/122/status$cat/proc/122/*#打印父进程树#-s--show-parents:显示父进程#-a--arguments:显示参数,如helloinechohello为参数$pstree122-sappprocfshttp://man7.org/linux/man-pag...进程的状态D不间断睡眠(一般为IO)Rrunningorrunnable(onrunqueue)Sinterruptiblesleep(waitingforaeventtocomplete)TstoppedbyjobcontrolsignalstoppedbydebuggerduringthetracingWpaging(notvalidsincethe2.6.xxkernel)Xdead(shouldneverbeseen)Zdefunct("zombie")process,terminatedbutnotnotreapedbyitsparent使用htop/top查看所有进程的状态信息,特别常用在几种情况平均负载过大时查看太多僵尸进程#第二行可以统计所有进程的状态信息$top...Tasks:214total,1running,210sleeping,0stopped,3zombie...进程内存ps-Orss指定rss查看进程的内存,还有命令top/htop和pidstat-r#查看2579PID的内存#-Orss表示附加的RSS信息,用于打印$ps-Orss2579PIDRSSSTTYTIMECOMMAND257919876Spts/1000:00:03nodeindex.js实时查看进程内存pidstat-sr#查看23097PID的内存信息,每秒打印一次#-r:查看进程内存信息#-s:查看进程的Stack信息#-p:指定PID#1:每1s打印一次#5:一共打印5组$pidstat-sr-p2309715Linux3.10.0-693.2.2.el7.x86_64(山岳)07/18/19_x86_64_(2CPUs)18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:080230970.000.00366424959962.47node1386:860:08UIDminfltIDsmajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:090230970.000.00366424959962.4713680node18:56:09UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:100230970.000.003694613694612.4713680node18:56:0980node18:56:10UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:110230970.000.00366424959962.4713680node18:56:11UIDPIDminflt/sVSMAZRSS/MEMStkizeStkrefCommand18:56:120230970.000.000.00366424959962.4713680nodeaverager:UIDPIDMINFLT/SMAJFLT/sMajflt/svszvszvszrssrssrssrssrsssizestkizestkizestkizestkizestkizestkref命令:页与页136pidstat-s、minflt和majflt表示缺页异常$pidstat-s-p2309715Linux3.10.0-693.2.2.el7.x86_64(shanyue)07/18/19_x86_64_(2个CPU)18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:080230970.000.00366424959962.47136:568node18UIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand18:56:090230970.000.00366424959962.4713680节点标准输出位于文件中listopenfileslsof,listopenfiles#listopenfilesFile$lsofCOMMANDPIDTIDUSERFDTYPEDEVICESIZE/OFFNODENAMEsystemd1rootcwdDIR253,140962/systemd1rootrtdDIR253,140962/namespacePID->globalPIDmappinginthecontainer问题是,如何找到pid在宿主机pid对应的docker容器中#容器环境#已知容器中进程的PID为122#在容器中查找PID对应的信息,在/proc/$中包含宿主机的信息pid/sched$cat/proc/122/schednode(7477,#threads:7)...#宿主机环境#7477是对应的可以在主机中找到全局PID#-p表示指定PID#-f表示打印更多信息$ps-fp7477UIDPIDPPIDCSTIMETTYTIMECMDroot747771610Jul10?00:00:38nodeindex.jsglobalPID->namespacePIDmapping另一个问题是,给定宿主机的PID,如何找到对应的容器。一个常见的场景是使用top/htop来定位占用内存/CPU过多的进程。这个时候就需要定位了。Container#通过dockerinspect找到对应的容器$dockerps-q|xargsdockerinspect--format'{{.State.Pid}},{{.ID}}'|grep22932#通过cgroupfs找到对应的容器$cat/etc/22932/cgroup还好有人在stackoverflow上总结了一下https://stackoverflow.com/questions/24406743/coreos-get-docker-container-name-by-pidSWAP#查找$vmstat-sinode#-i:打印inode编号$ls-lahinetworkthroughputbandwidth:指网络链路的最大传输速率throughput:表示单位时间内成功传输的数据量,单位为b/s(KB/s,MB/s)PPS:pck/s(PacketPerSecond),以网络包为单位的传输速率#查看网卡信息$ifconfigeth0$sar-nDEV1|grepeth0#IFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s16:34:37eth08.002.000.691.900.000.000.0016:34:38eth039.0027.002.9138.110.000.000.0016:34:39eth013.0011.000.9213.970.000.000.0016:34:40eth016.0016.001.2120.860.000.000.0016:34:41eth017.0017.001.5115.270.000.000.00Average:eth018.6014.601.4518.020.000.000.00socket状态socket信息推荐使用ss,但是netstat还是需要掌握的。在某些情况下(在docker中),可能没有ss命令#-tTCP#-a所有状态#-n显示数字地址和端口#-p显示pid$netstat-tanpActiveInternet连接(服务器和已建立)ProtoRecv-QSend-Q本地地址外部地址状态PID/程序名称tcp00127.0.0.11:352830.0.0.0:*LISTEN-tcp00192.168.112.2:37344172.18.0.1:6379ESTABLISHED78/nodetcp00:::80:::*LISTEN78/nodeRecv-Q和Send-WhenQ不为0,表示网络包堆积,需要注意协议信息#显示各个协议的统计信息$netstat-s#显示各个协议的统计信息$ss-sTotal:1468(kernel1480)TCP:613(estab270,closed315,orphaned0,synrecv0,timewait41/0),ports0TransportTotalIPIPv6*1480--RAW000UDP30228TCP298145153INET328167161FRAG000#你也可以这样统计estabsockets的数量$netstat-tanp|grep建立|wc-lTCP连接数PostgresSQL最大值连接数和当前连接数--最大连接数showmax_connections;--当前连接数selectcount(*)frompg_stat_activity;themaximumnumberofconnectionsandcurrentnumberofmysqlconnections--最大连接数showvariableslike'max_connections';--当前连接数showfullprocesslist;
