作者回复: 进程既有用户态也有内核态,在进程处于内核态时,就可能会申请连续内存。比如说进程要打开一个文件,那就会先查找该文件是否存在,查找的过程就是在内核态来完成的,然后这个过程中会分配文件所需要的一些内核结构体,比如dentry,inode等,这就需要申请内存,这些内存就是连续物理内存。
作者回复: 这个是proc里面的文件,使用前提是,你的内核需要支持它,需要4.18以及更新的内核。如果内核支持了该特性,你就可以去/proc/pressure/里面去读取它了,这里面会有memory,io,cpu的信息。 你可以做一些工具来解析这些信息,具体做法可以参考sar的做法。 采集完这些数据后,你就可以使用它来作为系统压力指标的参考了。比如在业务有抖动时,你可以观察是否某个指标有异常。
作者回复: 如果采集的数据很多,那么秒级监控的开销还是很大的,所以一般都不会每秒去采集很多系统指标。通常情况下都是采用事件机制,比如在内核里一些关键路径上挂上钩子,当异常行为发生时就把该事件记录下来,但是这样做毕竟只是针对有限的事件,不会涉及到太多的事件,不然系统开销还是会大。所以在发生问题后的事后采集机制还是有必要的,因为发生问题后,运维或者业务会更加关注原因会是什么,对采集带来的开销会有心里预期,所以可以接受一定程度的损耗。很多时候借助这些粗力度的指标,是可以大致判断出问题可能出在哪里,然后再针对性的去做更细粒度的监控。 想要精确,就需要结合业务来深度定制监控;想要覆盖面广一些,就要尽量保障监控开销。鱼与熊掌是很难兼得的。
作者回复: buffer/cache小的话,workingset refault会多,这会导致ioutil太高。为什么B中的buff/cache会比A中小那么多,我猜测是因为B中有很多不可以被回收的内存导致的,你可以观察下两个机器的/proc/meminfo,对比看看哪些项存在差异?
作者回复: 1. 这个单位是应用程序阻塞时间,以memory为例,那就是进程在内存申请上消耗的时间。加入10s内,进程在内存申请上消耗了5s,那avg10就是50。 2.total代表进程总的消耗时间,包括历史累积值。以memory为例,那就是在内存申请上消耗的总时间。 这些在Documentation里都有说明 。
作者回复: 页的交换是要依赖swap分区的,在开启了swap后匿名页(比如堆内存)就可以被交换到swap分区,这个行为会体现在pswpin和pswpout这两个指标中。 而pgpgin和pgpgout则是指文件页的读入读出,将磁盘文件读入内存和脏页写回磁盘,它们跟swap是没有关系的,即使没有swap也会有pgpgin和pgpgout。
作者回复: - 负载高是否是由锁冲突导致的 锁冲突有两类,一类是D,一类是spin,简单查看当前系统处于D和R的任务以及调用栈就可以判断,比如使用sysrq。 — resource temp unavailable 这个无法通过快照来查看 因为这是一次性的行为 结束后就没有现场了 除非可以复现出来
作者回复: 赞!回答的很好!
作者回复: 互联网企业普遍都是基于centos或者Ubuntu的内核,然后在这些内核的基础上来做自己定制化的特性,这些特性既有backport的 也有根据自己场景来实现的特定需求。生产环境上centos7是主流,内核为3.10,其次是centos8,内核为4.18。