我有一个系统,它收集大量数据,然后偶尔备份数据并将其推送到另一台服务器。我的问题是,虽然数据收集过程占用了 2-3% 的内存,但其余的 RAM 都被 PageCache 填满了,这给我带来了问题。
sysctl -w vm.drop_caches=1
清除内存,我可以设置 chron 作业来立即清除内存,但这似乎不是优雅的解决方案。我宁愿在应用程序使用的 raid 磁盘上完全禁用页面缓存,或者如果这不可能,则在整个服务器上禁用页面缓存。
我试过了此代码启动应用程序,但它对我来说不起作用,页面缓存不断积累。
我在 Ubuntu 服务器 20 上运行该程序
如何禁用硬盘/整个系统上的 PageCache?
更新
以下是随时间推移的免费内容:
>>> free
total used free shared buff/cache available
Mem: 3981820 202180 3600504 852 179136 3565116
Swap: 0 0 0
>>>free
total used free shared buff/cache available
Mem: 3981820 202336 3593204 852 186280 3561364
Swap: 0 0 0
>>>free
total used free shared buff/cache available
Mem: 3981820 203132 3505208 852 273480 3547512
Swap: 0 0 0
Buff/cache 持续增长,直到我刷新内存
>>>sudo lshw -C memory
*-firmware
description: BIOS
vendor: Amazon EC2
physical id: 0
version: 1.0
date: 10/16/2017
size: 64KiB
capacity: 64KiB
capabilities: pci edd acpi virtualmachine
*-memory
description: System memory
physical id: 1
size: 4GiB
>>>sysctl vm.swappiness
vm.swappiness = 60
答案1
您无权交换!
$ 免费
total used free shared buff/cache available
Mem: 3981820 202180 3600504 852 179136 3565116
Swap: 0 0 0
让我们创建一个/swapfile...
笔记:命令使用不当dd
可能导致数据丢失。建议复制/粘贴。
sudo swapoff -a # turn off swap
sudo rm -i /swapfile # remove old /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo chmod 600 /swapfile # set proper file protections
sudo mkswap /swapfile # init /swapfile
sudo swapon /swapfile # turn on swap
free -h # confirm 4G RAM and 4G swap
确认 /etc/fstab 中的此行...并确认没有其他“交换”行...
/swapfile none swap sw 0 0
reboot # reboot and verify operation
更新#1:
我调查了一下这个问题,发现当我接近可用内存限制时,我遇到的问题实际上是程序达到了打开文件限制,所以我最终修复了这个问题。添加/删除交换没有任何区别,运行清理内存的 cronjob 也没有区别。
答案2
安装nocache包:
sudo apt-get install nocache
然后使用 nocache 命令运行您的进程:
nocache whatever
这应该从源头上控制缓存累积问题。
答案3
要禁用写入缓存,请尝试以下操作:
编辑 /etc/hdparm.conf。
取消注释这两行中的第二行,使其看起来像这样:
# -W Disable/enable the IDE drive's write-caching feature
write_cache = off
要启用写缓存:
编辑 /etc/hdparm.conf。
注释掉这两行中的第二行,使其看起来像这样:
# -W Disable/enable the IDE drive's write-caching feature
# write_cache = off