内存瓶颈
分析内存相关问题应该从检查 vmstat 输出中的可用内存量开始,它位于第 4 列。
如果空闲内存很低,我们需要更多地调查哪个进程消耗了更多内存。
命令行选项
通过为 vmstat 命令提供不同的选项,可以包含其他信息。
列出了一些命令行选项:
-a | 显示活动和非活动内存。 |
---|---|
-f | 显示自启动以来的分叉数。 |
-t | 向输出添加时间戳。 |
-d | 报告磁盘统计信息。 |
磁盘/IO 性能
vmstat 实用程序无法告诉我们哪些磁盘存在瓶颈,但它可以告诉我们是否存在整体 IO 问题。
输出中的重要列是 b(阻塞)列。
它是指在过去的时间间隔内被阻塞或者等待 IO 完成的线程数。
大多数情况下,b 列应为 0。
如果该列中不断有非零数字,我们可以使用 iostat 进一步调查。
如何读取 vmstat 输出
vmstat 输出包含的不仅仅是内存统计信息。
与 iostat 和 mpstat 一样,vmstat 接受 interval 和 count 参数。
以下示例每隔 5 秒运行 3 个报告:
# vmstat 5 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 384120 68604 8088 327332 1 2 90 20 90 14 1 1 98 0 0 1 0 384120 68604 8088 327364 0 0 0 0 91 179 1 0 99 0 0 0 0 384120 68232 8088 327364 0 0 0 0 107 190 1 1 98 0 0
输出分为六个部分:
- procs
- memory
- swap
- io
- system
- cpu
procs进程信息
前两列提供有关进程的信息:
r | 处于等待状态的进程数。这些进程什么也不做,只是在等待运行。 |
---|---|
b | 自上次更新以来处于睡眠模式并被中断的进程数 |
memory
接下来的四列提供了有关内存的信息:
swpd | 使用的虚拟内存量 |
---|---|
free | 空闲内存量 |
buff | 用作缓冲区的内存量 |
cache | 用作缓存的内存量 |
swap
接下来的两列提供了有关交换的信息:
si | 从磁盘换入的内存量(每秒) |
---|---|
so | 换出到磁盘的内存量(每秒) |
非零 si 等数字表示没有足够的物理内存,内核正在将内存交换到磁盘。
io
前两列提供有关 I/O(输入-输出)的信息:
bi | 每秒从块设备接收的块数 |
---|---|
bo | 每秒发送到块设备的块数 |
system
接下来的两列提供以下系统信息:
in | 每秒中断数,包括时钟 |
---|---|
cs | 每秒上下文切换次数 |
CPU
最后五列给出了总 CPU 时间的百分比:
us | 用于用户进程的 CPU 周期百分比 |
---|---|
sy | 在系统(内核)进程上花费的 CPU 周期百分比 |
id | 闲置的 CPU 周期百分比 |
wa | 用于等待 I/O 的 CPU 周期百分比 |
st | 从虚拟机中窃取的 CPU 周期百分比 |
不带任何参数运行 vmstat
在开始之前,重要的是要注意 vmstat 的第一行输出(如果它不带参数运行,则是唯一给出的输出)是自系统启动时间以来的摘要。
它对于性能问题通常不是很有用,特别是如果系统已经运行了很长时间。
但是,它可能仍包含有关过去发生但当前未发生的事件的有用信息。
# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 387560 62140 44 348320 1 2 94 20 90 15 1 1 98 0 0
vmstat(虚拟内存统计)命令允许我们监控系统的内存使用情况。
它显示有多少虚拟内存,以及有多少空闲和分页活动。
我们可以观察发生的页面调入和调出。
这对于检测物理内存短缺非常有用,这会对系统性能产生不利影响。
CPU瓶颈
vmstat 输出中有两个与 CPU 性能有关的重要区域。
第一个是 r 列。
它是输出中的第一列。
它包含一个值,该值对应于运行 vmstat 的过去间隔期间运行队列中的线程数。
这些线程正在等待 CPU 可用才能运行。
对于此处合适的最大数量,有多种思想流派,但大多数人都同意,系统上的 CPU 数量超过 2 到 5 倍就表明存在瓶颈(此估计需要针对多核 CPU 进行调整)。
查找 CPU 相关数据的第二个位置是在输出的右侧列中。
一共有三列:us(用户)时间,sy(系统)时间,id(空闲)时间。
这三个按百分比分解了 CPU 时间的使用。
它们加起来应该是 100%。
理想情况下,CPU 将大部分时间用于 us 和 id 类别。
sy 类别是指 CPU 花费在驱动程序/内核级工作上的时间。
这个时间是从用户应用程序中带走的。
如果 CPU 的大部分时间都花在此类别上,则可能表明由于 CPU 或者内存瓶颈、内核级锁定问题或者其他问题导致上下文切换过多。
繁忙的系统将显示接近零的恒定空闲百分比。
但繁忙的系统并不一定意味着系统过载。