20 个回复
iwannabe
I wanna be
2019-02-13
http://www.newsmth.net/nForum/article/KernelTech/72788?s=72788
【 在 i00i (烟灰·独孤求胖) 的大作中提到: 】
:
: 因为buff/cache占了太多的内存又不会及时自行释放,导致系统开始使用虚拟内存,
: 拖慢系统不说,虚拟内存用量高了监控还得告警……
: ...................
i00i
烟灰·独孤求胖
2019-02-13
多谢~
sync后
echo 3 > /proc/sys/vm/drop_caches
能临时解决问题,不过老这么干也不是个事啊,或者说将之加入crontab?
我这边的场景是kvm宿主机+ceph,buff/cache对ceph有一点帮助,
但是对于qcow2及其备份来说就是鸡肋,而实际上巨大的buff/cache正是这样产生的。
ilovecpp
cpp
2019-02-13
这个因为...导致...的因果关系不成立。只要你有swap,没有cache的时候照样会有换出。最干脆的办法是不要挂载swap分区,你80G内存挂4G swap有什么意义?
【 在 i00i 的大作中提到: 】
:
: 因为buff/cache占了太多的内存又不会及时自行释放,导致系统开始使用虚拟内存,
: 拖慢系统不说,虚拟内存用量高了监控还得告警……
: ...................
i00i
烟灰·独孤求胖
2019-02-13
了解,vm.swappiness Debian默认记得是60,可用内存超过60%时是不会倾向于使用swap的,后来我改成10了。
不挂swap对我的场景估计不行,因为内存主要是给虚机使用的,虚机把物理内存塞爆的话没有swap大概率oom。
是否使用swap,策略上应该是把buff/cache占用的也算上的,参照的是free,所以即便vm.swappiness=10,
qcow2做一次备份,buff/cache塞满,free不足10%,就会使用swap。
我姑且先把vm.vfs_cache_pressure 改成 200试试吧。。按理说效果不会太理想。
【 在 ilovecpp 的大作中提到: 】
: 这个因为...导致...的因果关系不成立。只要你有swap,没有cache的时候照样会有换出。最干脆的办法是不要挂载swap分区,你80G内存挂4G swap有什么意义?
ilovecpp
cpp
2019-02-13
虽然很多文章这样说,但这种对swappiness的理解是错误的。
正如kernel文档所写,swappiness是一个比值,它越低就越倾向于drop cache而不是换出匿名页。但只要它不为0,就总有一定比例的匿名页被换出。具体来说,当swappiness设置为最大值100时,同等倾向于drop cache和换出匿名页。而swappiness设置为1时换出匿名页比例最小。设置为0时只在接近OOM时换出匿名页。
你理解的这个“可用内存比例”的阈值不存在。
https://github.com/torvalds/linux/blob/1f947a7a011fcceb14cb912f5481a53b18f1879a/mm/vmscan.c#L2282
【 在 i00i 的大作中提到: 】
: 了解,vm.swappiness Debian默认记得是60,可用内存超过60%时是不会倾向于使用swap的,后来我改成10了。
: 不挂swap对我的场景估计不行,因为内存主要是给虚机使用的,虚机把物理内存塞爆的话没有swap大概率oom。
: 是否使用swap,策略上应该是把buff/cache占用的也算上的,参照的是free,所以即便vm.swappiness=10,
: ...................
i00i
烟灰·独孤求胖
2019-02-13
大赞科普~
对于Linux内核我确实外行。
我的诉求应该也是Linux优化的一种常见情况吧:
1、因为大文件(GB级)长时间滞留内存没有额外好处,所以希望buff/cache尽少占用尽快释放,以免导致swap过早使用;
2、与1相关的,当free不足而buff/cache大量占用时,优先释放buff/cache而避免swap过早使用。
1和2只要有一条能实现,对于我的使用场景来说就算优化了。
这么理解可以么?
根据您的介绍,是不是让swappiness=1或0就能实现我说的2呢?
【 在 ilovecpp 的大作中提到: 】
: 虽然很多文章这样说,但这种对swappiness的理解是错误的。
: 正如kernel文档所写,swappiness是一个比值,它越低就越倾向于drop cache而不是换出匿名页。但只要它不为0,就总有一定比例的匿名页被换出。具体来说,当swappiness设置为最大值100时,同等倾向于drop cache和换出匿名页。而swappiness设置为1时换出匿名页比例最小。设置为0时只在接近OOM时换出匿名页。
: 你理解的这个“可用内存比例”的阈值不存在。
: ...................
lvsoft
Lv(The Last Guardian)
2019-02-13
我还是不理解你干嘛要挂swap。
你说不挂swap有oom的风险,但你物理内存80g,swap 4g,多了这4g难道就没oom风险了?
现代os的内存基本用途就是一层cache(这里的cache是广义的意思,跟你理解的
buff/cache狭义含义不同),你开了swap,冷数据自然会被交换出去换更大的cache空
间,这是必然发生的。
buff/cache是一种优化机制,简单的说就是不用白不用的意思,自然也不存在主动释放的
意义。你可以想象成你的钱存在了余额宝里面,钱还是在那里,要用就跟现金一样。
【 在 i00i (烟灰·独孤求胖) 的大作中提到: 】
: 大赞科普~
: 对于Linux内核我确实外行。
: 我的诉求应该也是Linux优化的一种常见情况吧:
: ...................
i00i
烟灰·独孤求胖
2019-02-13
关于swap,我是把预留给虚机的内存抹掉,为保障Linux本身和ceph能正常运行而设置的。
比如预想70GB给虚机,10GB给Linux和ceph,那么就相当于10GB的内存配4GB的swap。
这是一台proxmox服务器,按HCI方式部署的,可以姑且理解为KVM+Ceph,OSD也要共用内存。
“不用白不用”是理解了,问题在于“用了也白用”而且影响到swap……
以截图的这台物理机来说,那堆buff/cache就是在做虚机备份(把qcow2压缩为lzo)时产生的,
因为CPU能力有限,压缩并落盘的吞吐量磁盘还是能承受得起,并不依赖cache的帮助,
而且,压缩完落盘之后,这些lzo被再次ACCESS的概率≈0,留在内存里也白瞎啊。。
相反,ceph有些数据块留在cache里应该是有意义的,但是因为那些lzo滞留在内存,
反而逼得ceph操纵的数据块去使用swap了(实际观察到的情况)。
现在这个节点的KVM的负荷不高,实际只用了20GB左右,但是没经过业务高峰的考验,不敢贸然干掉swap。
【 在 lvsoft 的大作中提到: 】
: 我还是不理解你干嘛要挂swap。
: 你说不挂swap有oom的风险,但你物理内存80g,swap 4g,多了这4g难道就没oom风险了?
: 现代os的内存基本用途就是一层cache(这里的cache是广义的意思,跟你理解的
: ...................
iwannabe
I wanna be
2019-02-13
不知道弄个ramdisk, dd一个文件做swap如何,呵呵
【 在 i00i (烟灰·独孤求胖) 的大作中提到: 】
: 关于swap,我是把预留给虚机的内存抹掉,为保障Linux本身和ceph能正常运行而设置
: 的。
: 比如预想70GB给虚机,10GB给Linux和ceph,那么就相当于10GB的内存配4GB的swap。
: 这是一台proxmox服务器,按HCI方式部署的,可以姑且理解为KVM+Ceph,OSD也要共用
: 内存。
: ...................
zhlyang
New Life
2019-02-13
那跟完全不用swap没啥区别吧?
【 在 iwannabe (I wanna be) 的大作中提到: 】
: 不知道弄个ramdisk, dd一个文件做swap如何,呵呵
iwannabe
I wanna be
2019-02-13
有些应用强制要求swap,比如oracle
【 在 zhlyang (New Life) 的大作中提到: 】
: 那跟完全不用swap没啥区别吧?
lvsoft
Lv(The Last Guardian)
2019-02-13
nod,但我相信他不会遇到这个傻x case
【 在 iwannabe (I wanna be) 的大作中提到: 】
: 有些应用强制要求swap,比如oracle
lvsoft
Lv(The Last Guardian)
2019-02-13
我已经说了,现代os,内存就是一层cache。你可以写个程序malloc 1tb内存,再fork
100份试试看。理论上你要用100tb内存,实际上程序照样跑的很欢没任何毛病。
所以你只要保证你的物理内存>你实际应用需求就行,不用什么预留内存。这年头malloc
基本可以认为永远不会返回out of memory错误,只会触发kernel oom强制kill。
的。
内存。
【 在 i00i (烟灰·独孤求胖) 的大作中提到: 】
: 关于swap,我是把预留给虚机的内存抹掉,为保障Linux本身和ceph能正常运行而设置
: 比如预想70GB给虚机,10GB给Linux和ceph,那么就相当于10GB的内存配4GB的swap。
: 这是一台proxmox服务器,按HCI方式部署的,可以姑且理解为KVM+Ceph,OSD也要共用
: ...................
iwannabe
I wanna be
2019-02-13
http://www.newsmth.net/nForum/article/KernelTech/72788?s=72788
实际上还是有差别的
【 在 lvsoft (Lv(The Last Guardian)) 的大作中提到: 】
: 我已经说了,现代os,内存就是一层cache。你可以写个程序malloc 1tb内存,再fork
: 100份试试看。理论上你要用100tb内存,实际上程序照样跑的很欢没任何毛病。
: 所以你只要保证你的物理内存>你实际应用需求就行,不用什么预留内存。这年头
: malloc
: ...................
huang10zhi
heiheiha
2019-02-13
这100tb不就超过物理内存了吗?
【 在 lvsoft 的大作中提到: 】
: 我已经说了,现代os,内存就是一层cache。你可以写个程序malloc 1tb内存,再fork
: 100份试试看。理论上你要用100tb内存,实际上程序照样跑的很欢没任何毛病。
: 所以你只要保证你的物理内存>你实际应用需求就行,不用什么预留内存。这年头malloc
: ...................
i00i
烟灰·独孤求胖
2019-02-13
问题就是被kill不起啊亲,不管是虚机进程还是osd进程被kill,烂摊子都可能不好收拾。
我能做到KVM不超分内存,不过很难算准Linux自身和ceph在高负荷情况下需要多少内存,
而且还可能遇到别的物理节点挂了,HA漂移过来的虚机进程,这笔账算不清楚。
留个4G的swap只是作为缓冲而已,如果将来遇到极端场景崩了,我要么增大swap要么减少虚机,
横竖得再做个调整,好歹有个参考值了。
当然,可能更好的办法是把内存插满。。
【 在 lvsoft 的大作中提到: 】
: 我已经说了,现代os,内存就是一层cache。你可以写个程序malloc 1tb内存,再fork
: 100份试试看。理论上你要用100tb内存,实际上程序照样跑的很欢没任何毛病。
: 所以你只要保证你的物理内存>你实际应用需求就行,不用什么预留内存。这年头malloc
: ...................
i00i
烟灰·独孤求胖
2019-02-13
我想这为了说明“超了也无所谓”,到时哪个进程撞到边界值上allocate出错了,
那就它被kernel kill掉了,而kernel本身不至于崩溃。
【 在 huang10zhi 的大作中提到: 】
: 这100tb不就超过物理内存了吗?
i00i
烟灰·独孤求胖
2019-02-13
然也。
【 在 lvsoft 的大作中提到: 】
: nod,但我相信他不会遇到这个傻x case
i00i
烟灰·独孤求胖
2019-03-07
我重新体会了一下您的观点,决定还是应该听您的把swap禁掉。
实践也表明即便把vm.swappiness设置为0,
Linux也会在“它认为该用”的时候使用swap,即便还有大量物理内存。
“预留”swap对我的场景没有用处,所需物理内存也是完全可以预算的,
我应该预留的是物理内存,真正遇到压力时,最简单省事的做法是加内存条,插满为止。。。
感谢~
【 在 lvsoft 的大作中提到: 】
: 我已经说了,现代os,内存就是一层cache。你可以写个程序malloc 1tb内存,再fork
: 100份试试看。理论上你要用100tb内存,实际上程序照样跑的很欢没任何毛病。
: 所以你只要保证你的物理内存>你实际应用需求就行,不用什么预留内存。这年头malloc
: ...................