时长:大小13.88M
作者回复: 赞!
作者回复: 这是三个不同的维度:系统 -> node -> zone。我们调整的水位最终是提现在zone上,回收也是针对zone的。进程在申请内存时其实是会指定zone的,只是应用程序并不感知这个细节,对应用程序而言,它申请的内存一般都是normal zone,那么当normal zone中的剩余内存不足时就会触发回收;这里面又会涉及到node概念,假设有2个node,node 0的normal zone里剩余内存不足了就会唤醒kswapd0来回收node 0里normal zone的内存,但是此时应用是可以去继续申请node 1的normal zone的内存的(如果没有配置numa策略),如果node 1的normal zone剩余内存也不足了,那会唤醒kswapd1来回收node 1的normal zone。
作者回复: kswapd占用cpu高就意味着回收很困难,也就是系统中存在大量不可回收的内存,或者pagecache的回收较困难,比如脏页太多。kswapd本身回进行脏页的回写,但是iotop可以看到是kswapd在进行io;如果是业务进程io高,那有可能是因为它的page cache被回收掉,导致它不得不再次从磁盘来读数据,这个时候应该有很多pagein才会。你也可以观察下workingset refault,看看这个指标是否也高。
作者回复: 这是个好问题。 首先我们假设这个文件只有这一个进程打开。 如果是先关闭文件,再移除文件,那么移除文件时就会把这些dirty page释放掉,无需刷盘。 如果是先移除文件,那么在移除文件时由于该文件还有引用(还没有close),那么这些dirty pages还是会保留在内存中,接下来如果系统内存紧张了,就会触发回收内存,回收的过程中就可能会回写这些dirty pages,也就是说删除文件只是path不在了但是inode还在;如果没有回收行为发生,那么就不会去回写这些dirty pages,等close的时候就会把这些dirty pages释放掉。 另外 ,你说的这个使用文件的方式是进程创建临时文件的方法,也就是进程意外退出后不留下文件痕迹的方法。
作者回复: 调大min_free_kbytes其实是为了更早唤醒kswapd,从而避免直接回收,它降低的是直接回收的频率,会增加了kswapd后台回收的频率。对应用而言,直接回收会导致它的延迟,这个危害较大;如果后台回收太频繁,那后台回收线程kswapd可能会跟应用抢cpu,这也会间接影响应用,只是没那么明显,但也尽量要避免kswapd太消耗cpu,也就是不能把min_free_kbytes设置太大,合适就好。
作者回复: memory watermark主要是用来内存回收用的。在申请内存时,主要是看空闲内存(free list)是否足够,如果足够就可分配,如果不够的话,会先触发回收/规整,然后如果还不能分配到足够内存的话,就可能会产生oom。 所以zone normal high和触发os kill并没有直接关系。
作者回复: 进程绑定主要是减少调度开销以及cpu争抢,另外也可以提升cache命中率,将进程绑定后也可以更好的使用numa。理论上设置为1是会提升性能的,还要看node的kswapd是否能够及时回收内存,如果不能,那么设置为1反而会降低性能。
作者回复: 比如说min水位,这部分内存只有在部分场景下才能申请,是为了应对紧急内存申请,比如说atomic这种申请方式。那么min水位之下的内存,对于应用程序而言,就是无法申请的。
作者回复: 直接内存回收是在内核代码里执行的 它是属于内核态
作者回复: 包括脏页,可以理解为第二种情况是第一种情况的子集。 在直接内存回收时,可能系统中脏页很少,但是其他情况也会引起延迟,比如说内存规整(即系统内存碎片很严重时)。