psutil之cpu、memory、disk解析

psutil之cpu、memory、disk解析,第1张

psutil是一个Python写的方便获取系统硬件和性能信息的库。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。
>>>import psutil

>>>psutilcpu_count() #逻辑CPU个数

>>>psutilcpu_count(logical=False) #物理CPU个数

>>>psutilcpu_percent() #cpu平均使用率

>>>psutilcpu_percent(3) #最近3秒钟cpu平均使用率

>>>psutilcpu_freq() #CPU频率

scpufreq(current=8040, min=00, max=21120)

>>>psutilcpu_stats() #CPU状态

scpustats(ctx_switches=1910389985, interrupts=2644388135, soft_interrupts=0, syscalls=3686421224)
>>>import psutil

>>>psutilvirtual_memory()

部分嵌入式系统:

svmem(total=16919429120, available=4207607808, percent=751, used=12711821312, free=4207607808)

linux系统:

svmem(total=135077658624,available=12628275200,percent=907,used=122103193600,free=10256912384,active=111388827648,inactive=6278348800,buffers=278413312,cached=2439139328,shared=184320)

解析

1)total:总物理内存,包括已使用的物理内存和没使用的物理内存

total = used + free

2)used:已使用的物理内存

3)free:没使用的物理内存

4)available:可用内存,其包括没使用的物理内存,缓冲(如存在),缓存(若存在)。

available = free + buffers + cached

注意available和free的区别

5)percent:内存使用率,(总物理内存大小 - 可用内存大小) / 总物理内存大小 100

percent = (total - available) / total 100

延伸

交换内存

>>>import psutil

>>>psutilswap_memory()

sswap(total=29810581504, used=26177650688, free=3632930816, percent=878, sin=0, sout=0)
>>>import psutil

>>>psutildisk_usage("C:") # C盘的使用率

sdiskusage(total=285441257472, used=103434944512, free=182006312960, percent=362)

>>>psutildisk_usage("/") # 根分区的使用率

sdiskusage(total=225328492544, used=77228355584, free=148100136960, percent=343)

>>>psutildisk_partitions() # 获取分区信息

[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxf

ile=255, maxpath=260)]

>>>psutildisk_io_counters() #  获取硬盘总的io和读写信息

sdiskio(read_count=3036624, write_count=7461516, read_bytes=111278890496, write_bytes=176975582208, read_time=1369, write_time=3012)

>>>psutildisk_io_counters(perdisk=True) # 获取单分区的io和读写信息

{'PhysicalDrive0': sdiskio(read_count=3046900, write_count=7464803, read_bytes=111679064576, write_bytes=177050010624, read_time=1372, write_time=3014)}

1、之前偶尔也会出现个别readonly的情况,没有深入排查,只是推测和chunkserver磁盘坏道有关,当vm读写正好在chunkserver坏道的块上时,可能出现报错,导致异常。
2、此次出现大批量readonly,且监控和日志显示均是在凌晨出现,故排除磁盘坏道问题。
3、如果虚拟机上承载docker 、mysql 等可能造成大并发的业务,也可能造成此类问题。但是虚拟机镜像在mfs上是连续的空间,正常的mysql读写并不会有问题。有出现在vm上进行批量docker容器删除时,出现异常的情况。
4、推测有vm用户提交了大量并发的读写任务,而我们并未对虚拟机读写进行限制,也有可能造成此类问题。前期有vm出现load 90+ 报警,紧接着就有chunkserver出现load 100+的报警,和此问题非常类似。
排查定位:
1、检查宿主机负载、网络等,未发现异常情况。
2、检查mfschunkserver ,发现有部分磁盘出现raid errro。
3、检查mfschunkserver ,发现有一台chunkserver出现load +100,iowait达到90%以上的情况,带宽未见异常,写入的数据量也很低,现象大概持续3分钟左右。
4、检查vm在凌晨的监控情况,发现批量机器出现iowait达到100%,流量、load均未见明显异常。有部分vm上有大量的sendmail进程。
5、检查虚拟机上凌晨的crontab、进程等,没有发现异常。
6、检查mfs上的读写情况,未见在凌晨有大量的 chunk create 和replica,但是 max operations in queue 值特别高。
7、检查虚拟机备份程序,发现正好是在凌晨0:10进行备份,执行了snapshot *** 作,而且每台vm备份间隔仅1s,初步确认此备份为导致异常的主要原因。
由于snapshot *** 作并未带来大量的读写,之前并未关注到。在深入剖析了snapshot的原理,发现是执行了类似linux 系统的硬链接 *** 作,此时批量的snapshot虚拟机,200台vm大概20TB,按照mfs的每个chunk块 64MB的划分,换算下来执行一次 *** 作,会产生 2010241024/64 = 327680 创建链接的 *** 作,每台vm备份也会产生1600次 *** 作,如果在1s内没有完成,那么cpu队列就会越来越大,从而产生了load和iowait都非常高的现象。由于镜像备份并不是十分紧急的任务,故将间隔时间修改到60s执行一台。
可能造成虚拟机readonly故障的原因:
1、虚拟机备份进程的批量 *** 作产生大量的并发,导致chunkserver 的cpu队列拥塞,产生vm读写出现iowait过高超时的情况,从而造成了磁盘remount为readonly的情况。故有此类批量 *** 作的动作,一定要考虑并发负载的问题。 因为chunkserver是存储型服务器,cpu配置都比较低。
2、个别vm用户大量的提交任务导致后端异常。针对此现象,使用cgroug 进行io限制。可避免此类问题发生。
3、mfschunkser 规格建议配置一致,避免读写负载出现不均衡的情况。
此次定位问题耗时一周:
1、监控不到位,由于zabbix 进行大批量机器对比时,效率很低,临时部署了openfalcon和grafana,耗时较长。
2、没有关注到备份任务,之前一致以为是vm用户的问题,但是通过监控定位并不是用户的问题。
3、对mfs的snapshot未深入理解。

1从FATFS官网上下载FATFS程序
2把FATFS中文件上中的后缀名为c的文件改成cpp
3把FATFS程序(diskiocpp,diskioh,ffcpp,ffh,ffconfh,integerh)加载到自己的项目中(如果不会加,官网上有FATFS使用实例,大家可以参考)
4把FATFS中的ffconfh的_CODE_PAGE改成936(支持简体中文),_USE_LFN改成1(支持长文件名)
_LFN_UNICODE改成1(支持UNICODE)
5把cc936cpp(cc936c)和syscallc(syscallcpp)添加到自己的工程中

The names are pretty descriptive, but you can find more information on how to decipher /proc/diskstats here:>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13332996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-16
下一篇 2023-07-16

发表评论

登录后才能评论

评论列表(0条)

保存