![在系统开始交换/抖动之前我可以锁定多少内存?](https://linux22.com/image/574733/%E5%9C%A8%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%A7%8B%E4%BA%A4%E6%8D%A2%2F%E6%8A%96%E5%8A%A8%E4%B9%8B%E5%89%8D%E6%88%91%E5%8F%AF%E4%BB%A5%E9%94%81%E5%AE%9A%E5%A4%9A%E5%B0%91%E5%86%85%E5%AD%98%EF%BC%9F.png)
我正在尝试使用测试仪作为我所在组织的 Linux 机器的内存压力和正确性测试。Memtester 基本上只是将要测试的内存量作为参数,使用 锁定该内存量memlock()
,然后运行多个模式来验证内存是否良好。
由于我试图验证正确性,因此我希望尽可能多地测试机器的内存。我一直试图通过从 /proc/meminfo 传递 MemFree 来做到这一点。或者说,我有一个脚本可以生成多个进程,每个进程都请求 MemFree(见下文),因为操作系统不允许单个进程锁定超过 50% 的内存。
问题是,如果我锁定超过 90% 的内存,我的计算机就会锁定,大概是由于抖动。大约 30 分钟后,我终于可以再次使用它了。
是否有一种方法(通过编程或其他方式)来找出在开始交换之前可以锁定多少内存?
我希望这个可以在任何 Linux 机器上运行,所以任何需要我更改系统配置的事情都是不行的。另外,你可以假设测试将是系统上唯一运行的东西(当然,除了正常的操作系统之外),因为在对机器进行压力测试时,机器应该是独立的。
生成 memtester 进程的脚本的一部分
while [ $MEMAVAILABLE -ge 0 ]
do
./memtester $MEMAVAILABLE'K' &
sleep 10 #wait for previous process to lock its memory
MEMFREE=`cat /proc/meminfo | grep "MemFree" | sed 's/MemFree:\(\s\)*\(.*\) kB/\2/g'`
MEMAVAILABLE=$(($MEMFREE-($MEMTOTAL*5/100)))
done
wait
。
答案1
您的脚本可能由于竞争条件而分配了过多空间。在语句 1 和语句 2 中,语句 2 可以更早执行,循环将继续。依此类推。
您无法分配更多内存吗?我想我会尝试玩一下ulimit
。
现在回到主要问题 - 有多少内存。Linux 无法在类似 DOS 的模型上工作,就“可用”内存而言。MemFree 指标实际上应该称为 MemFreeImmediatelyAvailable。您可以分配远远超过这个数字的内存,除了可能进行一点分页外,什么也不会发生。但是如果您使用内存,这并不意味着 MemFree 会减少 - 内核会尽快将 Inact_clean 转换为 MemFree,以保持 MemFree 的最小大小(这也是您的脚本使用过多内存的另一个原因)。Inact_clean 类别的一个主要示例通常是文件系统的读取缓存 - 当程序需要更多内存时,内核可以立即“丢弃”它。我并不是说您可以安全地用完全部但很大一部分,是的,你可以。
- 活动:最近使用的内存,除非绝对必要,否则通常不会回收。
- Inact_dirty:脏意味着“可能需要写入磁盘或交换”。需要做更多工作才能释放。示例可能是尚未写入的文件。为了降低 I/O 速度,它们不会过早写入内存。例如,如果您正在写入日志,最好等到您准备好完整的日志后再将其发送到磁盘。
- Inact_clean:假定可以轻松释放。内核将尝试始终保留一些干净的内容,以便留出一些喘息空间。
- Inact_target:内核使用这个目标指标来确保周围有足够的非活动页面。如果超出该值,内核将不会将页面从活动页面移至非活动页面。页面还可以通过其他几种方式变为非活动页面,例如,如果您执行长顺序 I/O,内核会假定您不会使用该内存并预防性地使其变为非活动页面。因此,您可以获得比目标更多的非活动页面,因为内核将某些缓存标记为“更可能永远不会使用”,并让它按“最后使用”顺序作弊。
http://www.redhat.com/advice/tips/meminfo.html
最后,我发现这是一个更优雅的等价物:
sed -n '/MemFree/s/.*MemFree:\s*\([0-9]*\) kB.*/\1/gp' /proc/meminfo