Linux网络编程|Linux系统命令与CPU、硬盘、内存、网络状态监控

1. Linux常用工具命令: Linux系统中需要关注的指标包括CPU、硬盘、内存、网络状态这四个模块。
常用于“监控”的Linux系统命令包括:
Linux网络编程|Linux系统命令与CPU、硬盘、内存、网络状态监控
文章图片

常用于“性能测试”的Linux系统命令包括:
Linux网络编程|Linux系统命令与CPU、硬盘、内存、网络状态监控
文章图片

常用于“优化”的Linux系统命令包括:
Linux网络编程|Linux系统命令与CPU、硬盘、内存、网络状态监控
文章图片

2. 基础命令和工具: 2.1 uptime:机器启动时间+负载

root@virtual-machine:/# uptime 16:19:47 up 4 days,5:30,2 users,load average: 1.30, 1.34, 1.34

通常用于在线上应急或者技术攻关中,确定操作系统的重启时间。
2.2 ulimit:用户资源 Linux系统对每个登录用户都限制其最大进程数打开的最大文件句柄数。可根据实际的需求进行设置,使用 ulimit -a 来显示当前系统对用户的各项使用资源的限制。
root@virtual-machine:/# ulimit -a core file size(blocks, -c) 0 data seg size(kbytes, -d) unlimited scheduling priority(-e) 0 file size(blocks, -f) unlimited pending signals(-i) 15394 max locked memory(kbytes, -l) 65536 max memory size(kbytes, -m) unlimited open files(-n) 1024 pipe size(512 bytes, -p) 8 POSIX message queues(bytes, -q) 819200 real-time priority(-r) 0 stack size(kbytes, -s) 8192 cpu time(seconds, -t) unlimited max user processes(-u) 15394 virtual memory(kbytes, -v) unlimited file locks(-x) unlimited

2.3 curl http:HTTP返回结果 curl命令用于查看HTTP调用返回的结果是否符合预期。
curl -i "http://www.sina.com" # 打印请求响应头信息 curl -I "http://www.sina.com" # 仅返回http头 curl -v "http://www.sina.com" # 打印更多的调试信息 curl -verbose "http://www.sina.com" # 打印更多的调试信息 curl -d 'abc=def' "http://www.sina.com" # 使?post?法提交http请求 curl -sw '%{http_code}' "http://www.sina.com" # 打印http响应码

例如:
root@virtual-machine:/# curl -I www.baidu.com HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform Connection: keep-alive Content-Length: 277 Content-Type: text/html Date: Thu, 07 Oct 2021 08:28:21 GMT Etag: "575e1f72-115" Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT Pragma: no-cache Server: bfe/1.0.8.18

3. 关于进程的命令: 3.1 ps:进程信息 ps -ef 查看系统内所有进程,使用 grep进行过滤:
root@virtual-machine:/# ps -ef | grep redis xuesong657313790 10月03 ?00:10:52 ./redis-server 127.0.0.1:6379 root3095953080640 16:33 pts/400:00:00 grep --color=auto redis

使用 grep -v 反向过滤,忽略某些不想看到的内容:
root@virtual-machine:/# ps -ef | grep redis | grep -v grep xuesong657313790 10月03 ?00:10:52 ./redis-server 127.0.0.1:6379

3.2 top:进程CPU内存信息 top命令用于查看活动进程的CPU和内存信息,能够实时显示系统中各个进程的资源占用情况,可以按照CPU、内存的使用情况和执行时间对进程进行排序。
top - 17:04:13 up 4 days,5:58,2 users,load average: 1.17, 1.33, 1.39 任务: 360 total,3 running, 356 sleeping,1 stopped,0 zombie %Cpu(s): 40.3 us, 11.2 sy,0.0 ni, 48.2 id,0.0 wa,0.0 hi,0.3 si,0.0 st MiB Mem :3906.4 total,122.4 free,3107.5 used,676.5 buff/cache MiB Swap:923.3 total,0.0 free,923.3 used.505.3 avail Mem 进程号 USERPRNIVIRTRESSHR%CPU%MEMTIME+ COMMAND 303054 root2007864821620176 R99.70.5 167:38.28 gdb 307836 root200000 I0.70.00:03.51 kworker/1:4-events 10 root200000 S0.30.00:13.30 ksoftirqd/0 6573 xuesong200605881552948 S0.30.010:53.75 redis-server 7715 root200846962760 S0.30.02:32.02 file_server 7763 root20085108892556 S0.30.03:34.93 http_msg_server 7785 root20064412844592896 S0.31.128:36.37 db_proxy_server 45195 root20097270848960 S0.30.110:03.11 containerd 245808 xuesong200 24522523420010200 S0.30.90:28.57 WebExtensions 309588 root200000 I0.30.00:00.71 kworker/0:2-events 309875 root2002079238963128 R0.30.10:01.75 top 1 root20017158078083704 S0.00.21:29.20 systemd 2 root200000 S0.00.00:00.58 kthreadd 3 root0 -20000 I0.00.00:00.01 rcu_gp 4 root0 -20000 I0.00.00:00.00 rcu_par_gp

top命令参数详解参考:
https://blog.csdn.net/yjclsx/article/details/81508455
3.3 pidstat:进程资源: pidstat 用于监控全部或指定进程占用系统资源的情况,包括CPU、内存、磁盘I/O、线程切换、线程数等数据。
命令参数:
-u: 查看cpu相关的性能指标 -r: 查看内存使用信息 -d: 查看磁盘I/O统计数据 -p: 指明进程号

例如:
//第一步先使用ps命令查看redis的进程号: root@virtual-machine:/home/xuesong# ps -ef | grep redis | grep -v grep xuesong657313790 10月03 ?00:10:54 ./redis-server 127.0.0.1:6379//第二步根据进程号6573查看进程的CPU、内存、磁盘的占用信息: root@virtual-machine:/# pidstat -urd -p 6573 Linux 5.8.0-53-generic (xuesong-virtual-machine)2021年10月07日_x86_64_ (2 CPU)17时12分48秒UIDPID%usr %system%guest%wait%CPUCPUCommand 17时12分48秒100065730.080.100.000.050.180redis-server17时12分48秒UIDPIDminflt/smajflt/sVSZRSS%MEMCommand 17时12分48秒1000657311.190.016058815120.04redis-server17时12分48秒UIDPIDkB_rd/skB_wr/s kB_ccwr/s iodelayCommand 17时12分48秒100065731.560.000.00447redis-server

CPU信息:
%usr用户层正在使用的CPU百分比;
%system系统层正在使用的CPU百分比;
%CPU:进程整个占用的CPU时间百分比(%usr+%system)
CPU:处理器个数
%guest:运行虚拟机的CPU占用百分比。
对于“计算密集型”的应用,正常情况下应该占用更多的 %usr;
对于“IO密集型”的应用,正常情况下应该占用更多的 %system。
所以,如果你的应用程序是IO密集型的,比如是处理网络IO的程序,但是却 %usr过高导致cpu过高,那么这个时候需要关注一下是不是应用程序写的有问题。
内存信息:
VSZ:该线程使用的虚拟内存(以KB为单位);
RSS:该线程使用的物理内存(以KB为单位);
%MEM:当前任务使用的有效内存的百分比;
磁盘信息:
kB_rd/s:每秒此进程从磁盘读取的字节数(kB/s);
kB_wr/s:每秒此进程已经或者将要写入磁盘的字节数(kB/s)
kB_ccwr/s:由任务取消的写入磁盘的字节数(kB/s)。
4. 关于内存的命令: 4.1 free:内存 free命令用于显示系统内存的使用情况,包括总体内存、已经使用的内存;还可用于显示系统内核使用的缓冲区,包括缓冲(buffer)和缓存(cache)等。
root@virtual-machine:/# free 总计已用空闲共享缓冲/缓存可用 内存:4000136320059212650041356673044500884 交换:9454649454640

5. 关于CPU使用情况的命令: 5.1 vmstat: vmstat命令用于显示关于内核线程、虚拟内存、磁盘I/O、陷阱和CPU占用率的统计信息。
root@virtual-machine:/# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rb 交换 空闲 缓冲 缓存sisobiboincs us sy id wa st 10 945464 12268813800 659896131336552032 9500

cs表示线程环境的切换次数,此数据如果太大时表明线程的同步机制有问题;(图中cs值为20)
si和so较大时,说明系统频繁使用交换区,应该查看操作系统的内存是否够用
6. 关于磁盘I/O的监控命令: 6.1 iostat:IO状态 iostat命令用于监控CPU占用率、平均负载值和I/O读写速度等。
root@virtual-machine:/# iostat Linux 5.8.0-53-generic (virtual-machine)2021年10月07日_x86_64_ (2 CPU)avg-cpu:%user%nice %system %iowait%steal%idle 3.300.091.810.040.0094.75DevicetpskB_read/skB_wrtn/skB_dscd/skB_readkB_wrtnkB_dscd loop00.020.550.000.0020420500 loop10.010.030.000.001039700 loop100.000.010.000.00326400 loop110.2213.990.000.00517774300 loop120.000.010.000.00410900 loop130.000.050.000.001777200 loop140.000.010.000.00393300 loop150.000.010.000.00324800 loop160.000.010.000.00241500 loop170.000.000.000.00120300 loop180.000.000.000.001400 loop20.010.030.000.001214900 loop30.010.180.000.006636000 loop40.030.620.000.0022768800 loop50.000.010.000.00366800 loop60.040.350.000.0012984400 loop70.000.150.000.005563800 loop80.020.040.000.001350600 loop90.031.210.000.0044845500 sda7.09247.27129.150.0091507211477961270 scd00.000.000.000.00400

//cpu的统计信息:(如果是多cpu系统,显示的所有cpu的平均统计信息)%user:?户进程消耗cpu的?例 %nice:?户进程优先级调整消耗的cpu?例 %sys:系统内核消耗的cpu?例 %iowait: 等待磁盘io所消耗的cpu?例 %idle:闲置cpu的?例(不包括等待磁盘I/O)//磁盘的统计参数:tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"?次传输"意思是"?次I/O请求"。多个逻辑请求可能会被合并为"?次I/O请求"。"?次传输"请求的??是未知的。 kB_read/s: 每秒从设备(drive expressed)读取的数据量; kB_wrtn/s: 每秒向设备(drive expressed)写?的数据量; kB_read: 读取的总数据量; kB_wrtn: 写?的总数量数据量;这些单位都为Kilobytes

5.2 df:硬盘使用情况: df命令用于查看文件系统的硬盘挂载点和空间使用情况。
root@virtual-machine:/# df 文件系统1K-块已用可用 已用% 挂载点 udev19705200 19705200% /dev tmpfs40001636243963921% /run /dev/sda219993200 14781992 417256878% / tmpfs20000680 20000680% /dev/shm tmpfs5120451161% /run/lock tmpfs20000680 20000680% /sys/fs/cgroup /dev/loop12242562242560100% /snap/gnome-3-34-1804/66 /dev/loop42242562242560100% /snap/gnome-3-34-1804/72 /dev/loop652224522240100% /snap/snap-store/547 /dev/loop552352523520100% /snap/snap-store/518 /dev/loop866688666880100% /snap/gtk-common-themes/1515 /dev/sda152324880365152122% /boot/efi tmpfs4000121203998921% /run/user/1000 /dev/loop1056832568320100% /snap/core18/2074 /dev/loop1256832568320100% /snap/core18/2128 /dev/loop161017601017600100% /snap/core/11606 /dev/loop933152331520100% /snap/snapd/12883 /dev/loop02135042135040100% /snap/code/74 /dev/loop1333152331520100% /snap/snapd/13170 /dev/loop171017601017600100% /snap/core/11743 /dev/loop111281280100% /snap/bare/5 /dev/loop142135042135040100% /snap/code/75 /dev/loop1566816668160100% /snap/gtk-common-themes/1519

7. 查看网络信息和网络监控的命令: 7.1 ifconfig:网卡信息 ifconfig命令用于查看机器挂载的网卡情况。
其中lo是本地回绕。
root@virtual-machine:/# ifconfig docker0: flags=4099mtu 1500 inet 172.17.0.1netmask 255.255.0.0broadcast 172.17.255.255 inet6 fe80::42:29ff:fe65:1c1aprefixlen 64scopeid 0x20 ether 02:42:29:65:1c:1atxqueuelen 0(以太网) RX packets 0bytes 0 (0.0 B) RX errors 0dropped 0overruns 0frame 0 TX packets 10bytes 1104 (1.1 KB) TX errors 0dropped 0 overruns 0carrier 0collisions 0ens33: flags=4163mtu 1500 inet 172.16.5X.139netmask 255.255.255.0broadcast 172.16.5X.255 inet6 fe80::8798:75a4:862d:d083prefixlen 64scopeid 0x20 ether 00:0c:29:3b:d5:f0txqueuelen 1000(以太网) RX packets 2192604bytes 2726506782 (2.7 GB) RX errors 0dropped 0overruns 0frame 0 TX packets 653905bytes 83491630 (83.4 MB) TX errors 0dropped 0 overruns 0carrier 0collisions 0lo: flags=73mtu 65536 inet 127.0.0.1netmask 255.0.0.0 inet6 ::1prefixlen 128scopeid 0x10 looptxqueuelen 1000(本地环回) RX packets 5533524bytes 508807570 (508.8 MB) RX errors 0dropped 0overruns 0frame 0 TX packets 5533524bytes 508807570 (508.8 MB) TX errors 0dropped 0 overruns 0carrier 0collisions 0

7.2 ping:检查网络连接 ping命令是用检测网络故障的常用命令,可以用来测试一台主机到另外一台主机的网络是否连通。
7.3 telnet:远程登录: telnet 是TCP/IP协议族的一员,是网络远程登录服务器的标准协议,帮助用户在本地计算机上连接远程主机。
telnet与ssh的区别:
本质区别:telnet是明文传输,ssh是加密传输;
端口区别:telnet使用端口 23,ssh使用端口 22
7.4 netstat:网络连接端口信息: 【Linux网络编程|Linux系统命令与CPU、硬盘、内存、网络状态监控】netstat命令用于显示网络连接、端口信息等。
主要能查看到的信息包括: ① 端口状态(TCP的11个状态)、② 某条连接上的本端和对端的IP/端口信息、③ 某条连接上的发送队列/接收队列中的缓存报文信息(Recv-Q/Send-Q)。
常用参数:
`-t`: tcp `-u`: udp `-l`: listening //监听态 `-a`: all//所有的 `-n`: numeric//不要显示主机名,而是显示IP地址 `-c`: continuous //动态刷新,一秒一次 `-p`: program//显示占用端口的主机程序名,如redis

netstat -a:显示所有:
注意其中显示的是localhost主机名,使用-n则可以转为IP地址127.0.0.1
root@virtual-machine:/# netstat -a 激活Internet连接 (服务器和已建立连接的) Proto Recv-Q Send-Q Local AddressForeign AddressState tcp00 0.0.0.0:87000.0.0.0:*LISTEN tcp00 0.0.0.0:microsoft-ds0.0.0.0:*LISTEN tcp00 0.0.0.0:80000.0.0.0:*LISTEN tcp00 localhost:330600.0.0.0:*LISTEN tcp00 0.0.0.0:81000.0.0.0:*LISTEN tcp00 0.0.0.0:106000.0.0.0:*LISTEN tcp00 0.0.0.0:82000.0.0.0:*LISTEN tcp00 0.0.0.0:80080.0.0.0:*LISTEN tcp00 0.0.0.0:netbios-ssn0.0.0.0:*LISTEN tcp00 localhost:63790.0.0.0:*LISTEN tcp00 0.0.0.0:http0.0.0.0:*LISTEN tcp00 0.0.0.0:84000.0.0.0:*LISTEN tcp00 0.0.0.0:http-alt0.0.0.0:*LISTEN tcp00 0.0.0.0:tproxy0.0.0.0:*LISTEN tcp00 localhost:domain0.0.0.0:*LISTEN tcp00 0.0.0.0:ssh0.0.0.0:*LISTEN tcp00 localhost:ipp0.0.0.0:*LISTEN tcp00 0.0.0.0:86000.0.0.0:*LISTEN tcp00 localhost:86010.0.0.0:*LISTEN tcp00 localhost:55934localhost:mysqlESTABLISHED tcp00 localhost:36074localhost:6379ESTABLISHED tcp00 localhost:36072localhost:6379ESTABLISHED tcp00 localhost:55928localhost:mysqlESTABLISHED tcp00 localhost:10600localhost:59514ESTABLISHED tcp00 localhost:59536localhost:10600ESTABLISHED tcp00 localhost:36060localhost:6379ESTABLISHED

使用方法:
  1. 根据进程ID或应用程序名称查找端口:
    注意:此时必须使用参数 -p,否则不显示进程ID或者程序名,也就无法使用grep进行过滤了
root@xuesong-virtual-machine:/# netstat -anp | grep redis tcp00 127.0.0.1:63790.0.0.0:*LISTEN6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36062ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36066ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36060ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36058ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36076ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36074ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36072ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36064ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36068ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36070ESTABLISHED 6573/./redis-server //或者: root@xuesong-virtual-machine:/# netstat -anp | grep 6573 tcp00 127.0.0.1:63790.0.0.0:*LISTEN6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36062ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36066ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36060ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36058ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36076ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36074ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36072ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36064ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36068ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36070ESTABLISHED 6573/./redis-server

  1. 想要看看某个端口被哪个进程所占用,或者想要查看某个端口的当前TCP状态,使用netstat按照端口号进行过滤:
root@xuesong-virtual-machine:/# netstat -antp | grep 6379 tcp00 127.0.0.1:63790.0.0.0:*LISTEN6573/./redis-server tcp00 127.0.0.1:36074127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36072127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36060127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36062127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36068127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:6379127.0.0.1:36062ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36066ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36060ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:36066127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:6379127.0.0.1:36058ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36076ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:36070127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36064127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36058127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:36076127.0.0.1:6379ESTABLISHED 7785/./db_proxy_ser tcp00 127.0.0.1:6379127.0.0.1:36074ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36072ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36064ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36068ESTABLISHED 6573/./redis-server tcp00 127.0.0.1:6379127.0.0.1:36070ESTABLISHED 6573/./redis-server

-p是一个很有用的参数,可以查看到对应某个端口的应用程序名称及进程ID。
7.5 tcpdump:网络抓包 tcpdump是网络状况分析和跟踪工具,是可以用来抓包的使用命令。 使用前需要对TCP/IP有所熟悉,因为过滤使用的信息是TCP/IP格式。
常用参数:
`-i`: interface指定网卡 `-n`: Don't convert address to names 显示原始IP,不转换成主机名//原语运算: 与:`&&` 或者 `and` 或:`||` 或者 `or` 非:`!`或者 `not`//例如: src or dst portrange 6000-8000 && tcp//限定词: //1. Type: host:IP地址 port: 端口 portrange : 设置端口范围//2. Dir: src dst src or dst src and dst//3. Proto: ethr feddi tr wlan ip ip6 arp tcp udp//文件操作: -w:输出结果至文件 -C:限制输出文件的大小,超出后,以后缀1等数字的方式递增,单位是 1,000,000 字节 -W:指定输出文件的最大数量,超出后重写第一个文件 -r:读取一个抓包文件 -V:将待读取的多个文件名写入一个文件中,通过读取该文件同时读取多个文件

练习:
root@virtual-machine:/# tcpdump -n -i ens33 && tcp && src host 172.16.52.1 && src port 62557 21:04:54.605637 IP 172.16.52.1.62557 > 172.16.52.129.22: Flags [P.], seq 397:433, ack 645856, win 2048, options [nop,nop,TS val 287647214 ecr 3287211780], length 36 21:04:54.605740 IP 172.16.52.129.22 > 172.16.52.1.62557: Flags [P.], seq 646212:646568, ack 433, win 501, options [nop,nop,TS val 3287211781 ecr 287647214], length 356 ......3637 packets captured 3683 packets received by filter 46 packets dropped by kernel

9. Linux系统的高级工具: 9.1 pstack:查看进程的调用栈 pstack命令用来查看每个进程的调用栈,相当于是gdb的shell封装。使用方法是 pstack + 进程ID
[root@VM_0_3_centos ~]# pstack 25901 Thread 2 (Thread 0x7f950fd02700 (LWP 25902)): #0 0x00007f9514a1ff73 in select () from /usr/lib64/libc.so.6 #1 0x00007f95136b95a5 in apr_sleep () from /usr/lib64/libapr-1.so.0 #2 0x00007f9514645f19 in ?? () #3 0x0000000001186ec0 in ?? () #4 0x0000000001186ec0 in ?? () #5 0x00007f950fd01d60 in ?? () #6 0x00007f95146a3d9e in ?? () #7 0x0000000001184da0 in ?? () #8 0x0000000000000000 in ?? () Thread 1 (Thread 0x7f9515b348c0 (LWP 25901)): #0 0x00007f9514a29483 in epoll_wait () from /usr/lib64/libc.so.6 #1 0x000000000048604f in CEventDispatch::StartDispatch (this=0x1195600, wait_timeout=100) at /root/im/0voice_im/server/src/base/EventDispatch.cpp:365 #2 0x0000000000479ad2 in netlib_eventloop (wait_timeout=100) at /root/im/0voice_im/server/src/base/netlib.cpp:160 #3 0x000000000046f598 in main (argc=1, argv=0x7ffc278e13a8) at /root/im/0voice_im/server/src/login_server/login_server.cpp:132

9.2 strace:查看进程使用的系统调用 strace是Linux系统下的一款程序调试工具,用来监控一个应用程序所使用的系统调用,通过它可以跟踪系统调用,让你熟悉一个Linux程序在背后是怎么工作的。
使用举例:
root@xuesong-virtual-machine:/# ps -ef | grep redis xuesong657313790 10月03 ?00:11:06 ./redis-server 127.0.0.1:6379 root3177503136260 21:20 pts/400:00:00 grep --color=auto redisroot@xuesong-virtual-machine:/# strace -p 6573 strace: Process 6573 attached read(3, 0x7fff9710b807, 1)= -1 EAGAIN (资源暂时不可用) epoll_wait(5, [], 10128, 41)= 0 getpid()= 6573 openat(AT_FDCWD, "/proc/6573/stat", O_RDONLY) = 17 read(17, "6573 (redis-server) R 1379 6573 "..., 4096) = 345 close(17)= 0 read(3, 0x7fff9710b807, 1)= -1 EAGAIN (资源暂时不可用) epoll_wait(5, [], 10128, 100)= 0 getpid()= 6573 openat(AT_FDCWD, "/proc/6573/stat", O_RDONLY) = 17 read(17, "6573 (redis-server) R 1379 6573 "..., 4096) = 345 close(17)= 0 read(3, 0x7fff9710b807, 1)= -1 EAGAIN (资源暂时不可用) epoll_wait(5, [], 10128, 99)= 0 getpid()= 6573 ......

9.3 proc:查看运行时的系统内核参数: Linux系统内核提供了通过 /proc 文件系统查看运行时内核内部数据结构的能力,也可以改鬓内核参数设置。
例如:
//查看CPU信息: cat /proc/cpuinfo//查看内存信息: cat /proc/meminfo//查看磁盘映射信息: cat /proc/mounts

10. 日志监控工具: 10.1 tail: 11. 性能监控工具: 11.1 pmap: 11.2 nmon: 11.3 glances: 12. 性能测试: 13. 性能测试sysbench: 14. iperf测试服务器带宽: 15. Linux性能分析: 15.1 CPU性能原理篇: 在进行服务端性能测试时,需要观察系统对CPU的使用情况,以此作为衡量整个系统性能的重要指标,对于Linux CPU主要的关注点在 利用率、运行队列、负载、上下文切换 等,因此了解这些指标的含义和常用的监控方法对性能测试有很大的帮助。
15.1.1 CPU使用率:
Linux CPU使?率主要是从以下?个维度进?统计:
%usr:普通进程在?户模下下执?的时间;
%sys:进程在内核模式下的执?时间;
%nice:被提?优先级的进程在?户模式下的执?时间;
%idle:空闲时间。
%iowait:等待I/O完成的时间。
%irp:处理硬中断请求花费的时间。
%soft:处理软中断请求花费的时间。
%steal:是衡量虚拟机CPU的指标,是指分配给本虚拟机的时间?被同?宿主机别的虚拟机占?,?
般%steal值较?时,说明宿主机的资源使?已达到瓶颈;
?般情况下,CPU?部分的时间?都是消耗在?户态和内核态上。
sys和user间的?例是相互影响的,%sys?例?意味着被测服务频繁的进??户态和系统态之间的切换,
会带来?定的CPU开销,这样分配处理业务的时间?就会较少,造成系统性能的下降。对于IO密集型系
统,?论是?络IO还是磁盘IO,?般都会产??量的中断,从?导致%sys相对升?,其中磁盘IO密集型系
统,对磁盘的读写需要占??量的CPU,会导致%iowait的值?定?例的升?,所以当出现%iowait较?
时,需排查是否存在?量的不合理的?志操作,或者频繁的数据载?等情况;
CPU利?的详细情况可以通过top,vmstat命令进?查看
15.1.2 运行队列:
当Linux内核要寻找?个新的进程在CPU上运?时,必须只考虑处于可运?状态的进程,(即在
TASK_RUNNING状态的进程),因为扫描整个进程链表是相当低效的,所以引?了可运?状态进程的双
向循环链表,也叫运?队列(runqueue)。每个CPU或者说每个核都会维持?个运?队列,队列中存放
running和runnable两种状态的进程,CPU会不断的调度队列中的进程运?,因此队列中的进程数越多,
每个进程分别到的时间?就越少,程序的时间也就越?,同时CPU会不断的处于运?状态,性能开销较
?。可以通过观察?定时间内运?队列中的进程数量来判断CPU是否达到的瓶颈,这就有了负载的概念;
15.1.3 负载:
CPU的负载(Load),是指在?段时间内 CPU正在处理以及等待 CPU处理的进程数之和的统计信息,也
就是 CPU运?队列?度的统计信息。平均负载(Load Average)是指上?段时间内同时处于运?队列的
平均进程数,Load Average是反应系统压?的重要指标,Load Average越?说明对于CPU资源的竞争越
激烈,CPU资源?较短缺。对于资源的申请和维护其实也是需要很?的成本,所以在这种?Average
Load的情况下CPU资源的?期“热竞争”也是对于硬件的?种损害。
举个例?,把CPU处理进程的过程看成??站售票:
假如售票处有10个窗?,买票的?只有1个,毫?疑问,这个乘客随便找个窗?买完票就可以拍屁股?
?了,?且还有9个售票?员可以喝茶看报纸,这时的平均负载是0.1,售票运作毫?压?;
如果买票的?有10个,那也还好,?个窗??个?,所有窗?的售票?员都在?作,也可以快速的买到
票,这时的平均负载是1,所有的售票窗?都在运作;
如果有20个?在买票,这就要出现排队的情况,售票?员要不停的卖票,直到排队的都买到票,这时平
均负载是2,所有售票窗?都在运作,?且出现了排队情况;
如果是100,200?或者更多的?买票,这时售票?员就要不停的?作,为了不把售票?员累坏可能就要考
虑增加窗?,也就是扩容了。?实际CPU处理进程时并不是像售票?样卖完?个?下?个?,CPU处理每
个进程时是有固定的时间?,如果在时间?内这个任务没有处理完,就要挂起这个任务处理下?个,这是
就会产?中断,?负载的情况下会不断产?进程间的调?,从?产??量中断,造成系统的开销,所以在
做性能测试时,要重点关注负载情况,来判读CPU是否达到了瓶颈,依据经验分析,单核CPU负载<2时,
系统性能是良好的,当单核CPU负载>5时,那么就表明这个机器存在严重的性能问题。
负载可以通过top,uptime、cat /proc/loadavg等命令查看1分钟,5分钟,15分钟的负载值:
15.1.4 上下文切换:
?个标准的Linux内核可以?持运?50~50000个进程运?,对于普通的CPU,内核会调度和执?这些进
程。每个进程都会分到CPU的时间?来运?,当?个进程?完时间?或者被更?优先级的进程抢占后,它
会备份到CPU的运?队列中,同时其他进程在CPU上运?。这个进程切换的过程被称作上下?切换。
Linux系统具有两个不同级别的运?模式,内核态和?户态,其中内核态的运?级别要?于?户态,这个级
别可以进?任何操作,?般内核运?与内核态,?应?程序是运?在?户态。当发?上下?切换时,通过
系统调?,处于?户态的应?程序就会进?内核空间,待调?完成之后重新返回值?户态运?,因此上下
?切换存在系统开销,会?定程度上增加%sys的值。
当?个进程在执?时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下?。
当内核需要切换到另?个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下?,以便在再
次执?该进程时,能够必得到切换时的状态执?下去。在LINUX中,当前进程上下?均保存在进程的任务
数据结构中。在发?中断时,内核就在被中断进程的上下?中,在内核态下执?中断服务例程。但同时会保
留所有需要?到的资源,以便中断服务结束时能恢复被中断进程的执?。
引起上下?切换的原因有哪些? 对于抢占式操作系统??, ?体有?种:
  1. 当前任务的时间??完之后,系统CPU正常调度下?个任务;
  2. 当前任务碰到IO阻塞,调度线程将挂起此任务,继续下?个任务;
  3. 多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下?个任务;
  4. ?户代码挂起当前任务,让出CPU时间;
  5. 硬件中断;
    vmstat中的cs为中断数量
15.1.6 中断:
中断是指CPU执?程序时,由于发?了某种随机的事件(外部或内部),引起CPU暂时中断正在运?的程
序,转去执??段特殊的服务程序(称为中断服务程序或中断处理程序),以处理该事件,该事件处理完后?
返回被中断的程序继续执?。引?中断的原因有以下?点:
  1. 提?数据传输率;
  2. 避免了CPU不断检测外设状态的过程,提?了CPU的利?率。
  3. 实现对特殊事件的实时响应。如多任务系统操作系统中缺?中断、设备中断、各类异常、实时钟等
    中断根据中断源的不同可以分为硬中断和软中断:
    硬中断: 硬中断?称外部中断,是由硬件产?,如键盘,?标,打印机等。每个设备或设备集都有它
    ??的中断请求(IRQ),基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上,处理中断的驱
    动是需要在CPU上运?的,因此中断产?时,CPU会中断当前正在运?的任务来处理中断,在多核的
    操作系统中,?个中断通常只能中断?颗CPU(核)。
    软中断: 软中断?称内部中断,由软件系统本身发给操作系统内核的中断信号。通常是由硬中断处理
    程序或进程调度程序对操作系统内核的中断,也就是我们常说的系统调?(System Call)。?般情况下
    软中断是处理I/O请求时发?订单,这些请求会调?内核中的处理I/O的程序,对于某些设备,I/O请求
    需要被?即处理,?磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被
    挂起直到I/O完成,此时内核调度器就会选择另?个进程去运?。I/O可以在进程之间产?并且调度过程
    通常和磁盘I/O的?式是相同。在I/O密集型系统中可能会出现?量的中断请求,中断会产?中断上下
    ?,造成CPU开。
    可以通过top,vmstat等查看CPU的相关命令中监控中断情况
15.1.7 负载与CPU利用率的关系:
负载和CPU利?率都是衡量CPU性能的指标,那么CPU利?率?的话负载?定?吗?要回答这个问题?先
要CPU资源在什么情况下会被消耗,CPU利?率其实是指为了处理进程抢占CPU时间?的?例,也就是只
有处于运?状态的进程才会获得时间?,从?造成CPU利?率的上升,?所需CPU时间?的多少取决于进
程中需要CPU运算逻辑的复杂程度。?负载是指运?队列中等待和运?的进程数的总和,在负载很?时,
可能是出于等待运?的进程数较多,这些进?并不会占?过多的时间?,队列中进程消耗的CPU资源也有
可能只是集中在某?个对CPU运算依赖较?的?个进程上。所以CPU利?率和负载之间并没有硬性的?例
关联关系,衡量CPU性能时要同时关注两个性能指标,综合考虑。
15.2 遇到CPU利用率高该如何排查: 遇到CPU使?率?时,?先确认CPU是消耗在哪?块,如果是内核态占?CPU较?:
  1. %iowait ?,这时要重点关注磁盘IO的相关操作,是否存在不合理的写?志操作,数据库操作等;
  2. %soft或%cs ?,观察CPU负载是否较?、?卡流量是否较?,可不可以精简数据、代码在是否在多
    线程操作上存在不合适的中断操作等;
  3. %steal ?,这种情况?般发?在虚拟机上,这时要查看宿主机是否资源超限;
    如果是?户态较?,且没有达到预期的性能,说明应?程序需要优化。
15.2.1 根据指标查找工具:
15.2.2 如何迅速的分析CPU性能瓶颈:
15.2.3 性能优化方法论:
15.2.4 性能指标总结:
关于CPU的经验指标,可以作为参考:
  1. 对于每一个CPU来说,运行队列不要超过2,例如,如果是双核CPU,就不要超过4;
  2. 如果CPU在满负荷运行,应该符合下列分布:
    %usr time: 65%~70%,如果高于此数值,可以考虑对应用程序进行优化;
    %system time:30%~35%,如果高于此数值,观察是否有过多的中断或者上下文切换;
    %idle:0%~5%
  3. 对于上下文切换,要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。

    推荐阅读