Linux CPU、内存、磁盘、使用率计算
原创作品,转载请标明出处。
命令方式查看:
cpu使用率:
如果发现多个进程cpu使用率加起来高于100%,或者单个进程(可能开多个线程导致)使用率高于100%,说明该top工具版本比较旧,使用单核cpu方式计算的使用率。
解决办法:
- 更新top工具或者使用其他工具(经测试busybox-1.29.3中的top命令是准确的)。
- 手动计算,用 使用率 除以 cpu核数 = 真实的cpu使用率。
[root@agent ~]# top
1548244028619.png
memory使用率:
计算方式:used / total * 100% = 内存使用率
[root@agent ~]# free
1548244619967.png
disk使用率:
[root@agent ~]# df
1548244755982.png
解析proc文件获取:
cpu使用率:
proc文件:/proc/stat
字段解释:只看行首以cpu开头的行,每列字段含义为:
- name 设备名
- user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
- nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。
- system 从系统启动开始累计到当前时刻,处于核心态的运行时间。
- idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间。
- iowait 从系统启动开始累计到当前时刻,IO等待时间。
- irq 从系统启动开始累计到当前时刻,硬中断时间。
- softirq 从系统启动开始累计到当前时刻,软中断时间。
- stealstolen 从系统启动开始累积到当前时刻,在虚拟环境运行时花费在其他操作系统的时间。
- guest 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费的时间。
- guest_nice 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费在nice进程上的时间。
cpu每核时间:
- 第一行name为cpu,描述的是总的cpu时间分配。
- cpu[0 1 2 3 ...],指的是cpu单核的时间分配。
单位:jiffies
jiffies 是内核中的一个全局变量,用来记录系统启动以来产生的节拍数,在 Linux 中,一个节拍大致可以理解为操作系统进程调度的最小时间片,不同的 Linux 系统内核这个值可能不同,通常在 1ms 到 10ms 之间。
计算方式:
- cpu总时间 = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest + guest_nice
- cpu使用率计算
- 请在一段时间内(推荐:必须大于0s,小于等于1s),获取两次cpu时间分配信息。
- 计算两次的cpu总时间:total_2 - total_1
- 计算两次的cpu剩余时间:idle_2 - idle_1
- 计算两次的cpu使用时间:used = (total_2 - total_1) - (idle_2 - idle_1)
- cpu使用率 = 使用时间 / 总时间 * 100% = used / total * 100%
[root@agent ~]# cat /proc/stat
1548244985880.png
memory使用率
proc文件:/proc/meminfo
字段解释:
- MemTotal 可用的总内存--总物理内存减去kernel 代码/数据段占用再减去保留的内存区,mem_init_print_info里面有具体计算方式。
- MemFree 完全未用到的物理内存 LowFree + HighFree。
- MemAvailable MemFree+Active(file)+Inactive(file) - (watermark+min(watermark,Active(file)+Inactive(file)/2)) file占用的内存是可以释放的,但是释放的过多,会导致swap发生。
- Buffers block device 文件读写用到的page 。
- Cached 普通文件占用的缓冲,所有缓冲页(page cache)的总和,包括:
cached+buffer+swap cache swap cache中包含的是被确定要swapping换页、但是尚未写入物理交换区的匿名内存页(匿名指的是未关联任何具体文件) - SwapCached 内存足够的情况下,这个值一般为0,那些匿名内存页,比如用户进程通过malloc()申请的内存页是没有关联任何文件的(有别于backing storage基于磁盘文件的内存页),如果发生swapping换页,这类内存页会被写入交换区。从一个匿名内存页被确定要被换页开始,它就被计入了swap cache,但是不一定会被立刻写入物理交换区,因为Linux的原则是除非绝对必要,尽量避免I/O。所以swap cache中包含的是被确定要swapping换页、但是尚未写入物理交换区的匿名内存页。
- Active (pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),ACTIVE_ANON和ACTIVE_FILE,分别表示anonymous pages和mapped pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为anonymous pages。
- Inactive pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE],这部分具体可以参考LRU 内存管理算法。
- SwapTotal 可用的swap空间的总的大小。
- SwapFree 剩余swap空间的大小。
- Dirty 需要写入磁盘的内存区大小。
- Writeback 正在被写回磁盘的大小。
- AnonPages 未映射页的内存大小。
- Mapped 设备和文件等映射的大小。
- Slab 内核数据结构slab的大小,可以减少申请和释放内存带来的消耗。
- 其他字段请自行百度参考。
计算方式
- 内存使用率 = (MemTotal - MemAvailable) / MemTotal * 100%
[root@agent ~]# cat /proc/meminfo
1548246581741.png
disk使用率
目前没有最准确的方式(没有精力去百度翻资料)来获取,后续补上。。。