ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
通过下面十个命令来了解有关系统资源使用和运行情况 ~~~ uptimed mesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top ~~~ ## 1\. uptime ~~~ $ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02 ~~~ load average除以CPU核心数得到每个CPU的平均活跃进程数,数值越大表示每个CPU上运行的进程越多,系统压力越大,当平均值大于0.7时表示系统较为繁忙。 ## 2\. dmesg | tail 展示最近10条系统消息。在这些系统消息中查找最有可能引起性能问题的原因。 ## 3\. vmstat 1 ~~~ root@vultr:~# vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 3 0 9364 1576 103296 0 0 7265 165 13 15 3 6 90 1 0 0 3 0 6220 1644 105512 0 0 17283 108 694 1398 2 5 0 93 0 ~~~ `free`:空闲的内存(单位的KB)。如果计数很大,说明服务器有足够的内存,`free -m`命令将对空闲内存的状态有更好的说明。 `si`、`so`:交换置入和交换置出。如果这两个值是非空,说明物理内存用完了,现在在使用交换内存了。 如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。如果pi,po 长期不等于0,表示内存不足。如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。 ## 4\. mpstat -P ALL 1 ~~~ Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 1.21 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 98.38 Average: 0 1.21 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 98.38 ~~~ %usr在 internal 时间段里,用户态的 CPU 时间(%),不包含 nice 值为负进程。 %sys在 internal 时间段里,核心时间(%)。 %nice在 internal 时间段里,nice 值为负进程的 CPU 时间(%)。 %iowait在 internal 时间段里,硬盘 IO 等待时间(%)。 %irq在 internal 时间段里,硬中断时间(%)。 %soft在 internal 时间段里,软中断时间(%)。 可用于检查不平衡的情况。单个热CPU说明是单线程应用程序在大量占用CPU时间。 ## 5\. pidstat 1 ~~~ 07:23:44 AM UID PID %usr %system %guest %wait %CPU CPU Command 07:23:45 AM 0 21757 1.01 0.00 0.00 0.00 1.01 0 sshd 07:23:45 AM 0 23597 0.00 1.01 0.00 1.01 1.01 0 pidstat 07:23:45 AM 0 23598 0.00 1.01 0.00 1.01 1.01 0 etcd 07:23:45 AM UID PID %usr %system %guest %wait %CPU CPU Command 07:23:46 AM 0 851 0.99 0.00 0.00 0.00 0.99 0 python 07:23:46 AM 0 23597 0.99 0.00 0.00 0.00 0.99 0 pidstat 07:23:46 AM UID PID %usr %system %guest %wait %CPU CPU Command 07:23:47 AM 0 23598 1.02 0.00 0.00 0.00 1.02 0 etcd ~~~ 常用的参数: * `-u`默认参数,显示各个进程的 CPU 统计信息 * `-r`显示各个进程的内存使用情况 * `-d`显示各个进程的 IO 使用 * `-w`显示各个进程的上下文切换 * `-p PID`指定 PID %cpu即可查看每个进程cpu占用情况。 ## 6\. iostat -xz 1 ~~~ Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util vda 38.00 133.00 860.00 1412.00 0.00 2.00 0.00 1.48 0.63 0.15 0.03 22.63 10.62 0.05 0.80 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util vda 131.25 2.08 920.83 4.17 0.00 0.00 0.00 0.00 0.10 0.00 0.00 7.02 2.00 0.00 0.00 ~~~ 这是了解块设备(磁盘),应用的工作负载和产生的性能影响的绝佳工具。重点关注下面的指标: * `r/s`、`w/s`、`rkB/s`、`wkB/s`:这些是设备每秒交付的读取、写入、读取千字节和写入千字节。使用这些来表征块设备的工作负载。性能问题可能是由于向块设备施加了过多的工作负载。 * `await`:IO的平均时间,以毫秒为单位。这是应用程序所感受到的时间,它包括IO排队时间和IO服务时间。大于预期的平均时间可能表示块设备饱和或设备出现问题了。 * `avgqu-sz`:发给设备的平均请求数。值大于1可以表明已达到饱和状态(尽管设备通常可以并行处理请求,尤其是在多个后端磁盘所组成的前端虚拟设备的情况下)。 * `%util`:设备利用率。这是一个表征繁忙度的百分比,它表示设备每秒工作的时间。尽管它的值取决于设备,但值大于60%通常会导致性能不佳(也会通过await的值观察到)。接近100%的值通常表示饱和。 \*如果存储设备是有许多后端磁盘组成的前端逻辑磁盘设备,则100%的利用率可能仅意味着100%的时间正在处理某些IO,但是后端磁盘可能远远没有饱和,并且可能还可以处理更多的工作。 请记住,性能不佳的磁盘IO不一定是应用问题,通常可以使用许多技术以执行异步IO,以便使应用程序不会被阻塞住而产生直接产生IO延迟(例如,预读和缓冲写入技术) ## 7\. free -m root@vultr:~# free -m total used free shared buff/cache available Mem: 481 331 18 0 131 137 Swap: 0 0 0 右边两列: * `buffers`:缓冲区高速缓存,用于块设备I / O * `cached`:页面缓存,由文件系统使用 我们只需要检查下它们的大小是否接近零。如果接近零的话,这可能导致较高的磁盘IO(可以使用iostat进行确认)和较差的性能。上面的示例看起来不错,每列都有较大的数据。 `-/+ buffers/cache`为已用和空闲内存提供较少让人产生混乱的值。Linux将可用内存用于高速缓存,但是如果应用程序需要,它们可以快速被回收。因此应以某种方式将缓存的内存包括在`free`列中,这也就是这一行的所做的。甚至还有一个[网站](http://www.linuxatemyram.com/)专门讨论了这种混乱。 如果在Linux上使用ZFS,就像我们对某些服务所做的那么,因为ZFS具有自己的文件系统缓存,它们并不会反映在`free -m`的列中,因此这种场景下这种混乱还将存在。所以会看到似乎系统的可用内存不足,而实际上可根据需要从ZFS缓存中申请到内存。 ## 8\. sar -n DEV 1 ~~~ 07:48:28 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 07:48:29 AM ens3 3.06 10.20 0.32 1.52 0.00 0.00 0.00 0.00 07:48:29 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:48:29 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:48:29 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 07:48:30 AM ens3 5.94 16.83 0.39 2.26 0.00 0.00 0.00 0.00 07:48:30 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:48:30 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ~~~ 此工具可以检查网络接口的吞吐量:`rxkB/s`和`txkB/s`,作为工作负载的度量,还可以检查是否已达到网络接口的限制。在上面的示例中,eth0接收速率达到22MB/s,即176Mbit/s(远低于1Gbit/s的网络接口限制,假设是千兆网卡)。 ## 9\. sar -n TCP,ETCP 1 ~~~ 07:50:27 AM active/s passive/s iseg/s oseg/s 07:50:28 AM 4.08 1.02 9.18 14.29 07:50:27 AM atmptf/s estres/s retrans/s isegerr/s orsts/s 07:50:28 AM 0.00 0.00 1.02 0.00 0.00 Average: active/s passive/s iseg/s oseg/s Average: 3.52 1.01 14.32 18.09 Average: atmptf/s estres/s retrans/s isegerr/s orsts/s Average: 0.00 0.00 2.51 0.00 0.50 ~~~ 这是一些关键的TCP指标的摘要,包括: * `active / s`:每秒本地启动的TCP连接数(例如,通过connect())。 * `passive/s`:每秒远程启动的TCP连接数(例如,通过accept())。 * `retrans / s`:每秒TCP重传的次数。 主动和被动计数通常作为服务器TCP负载的粗略度量:新接受的连接数(被动)和新出站的连接数(主动)。将主动视为出站,将被动视为入站可能对理解这两个指标有些帮助,但这并不是严格意义上的(例如,考虑从localhost到localhost的连接)。 重新传输是网络或服务器问题的迹象;它可能是不可靠的网络(例如,公共Internet),也可能是由于服务器过载并丢弃了数据包。上面的示例仅显示每秒一个新的TCP连接。 ## 10\. perf