在系统开始交换/抖动之前,我可以locking多less内存?

我正在尝试使用Memtester作为我公司Linux机器的内存压力和正确性testing。 Memtester基本上只需要大量的内存来testing参数,使用memlock()locking那么多的内存,然后运行一些模式来validation内存是否好。

由于我试图validation正确性,所以我想尽可能多地testing机器的内存。 我一直试图通过从/ proc / meminfo传递MemFree来做到这一点。 或者说,我有一个产生多个进程的脚本,每个进程都要求MemFree(见下文),因为操作系统不允许单个进程locking超过50%的内存。

问题是,如果我locking超过90%的内存,我的电脑locking,大概是由于颠簸。 大约30分钟后,我终于能够再次使用它。

有没有一种方法,以编程方式或其他方式,找出我可以locking多less内存之前开始交换?

我希望这可以在任何Linux机器上运行,所以任何需要我改变系统configuration的东西都是不可行的。 另外,你可以假设testing是系统上唯一运行的东西(当然除了正常的操作系统的东西),因为机器应该被放在一边,而我们正在对它们进行压力testing。


生成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 

由于竞争条件,您的脚本可能分配太多。 在statement1和statement2中,statement2可以更早执行,循环将继续。 等等。

你不能分配更多的内存? 我想我会尝试玩ulimit

现在的重点 – 多less内存。 对于“空闲”内存,Linux不能在类DOS模式下工作。 度量MemFree应该被称为MemFreeImmediatelyAvailable。 你可以分配的远远不止这些,除了可能的一点点分页之外什么都不会发生。 但是,如果使用内存,并不意味着MemF​​ree会减less – 内核会尽快将Inact_clean转换为MemFree,以保持MemFree的最小大小(另一个原因是脚本将使用太多)。 Inact_clean类别的一个主要示例通常是文件系统的读caching – 内核可以立即“丢弃”它,因为程序需要更多的内存。 我并不是说你可以安全地吃掉所有的东西,但很大一部分,是的,你可以。

  • 活动:最近使用的内存,除非绝对必要,通常不会回收。
  • Inact_dirty:脏意味着“可能需要写入磁盘或交换”。 需要更多的工作来释放。 示例可能是尚未写入的文件。 为了保持I / O不变,它们不会被过早地写入内存。 例如,如果你正在写日志,最好等到你有一个完整的日志准备就绪后再发送到磁盘。
  • Inact_clean:假设是很容易释放的。 内核将尽量保持一些干净的东西总是有一点喘息的空间。
  • Inact_target:内核用来确保有足够的不活动页面的目标度量。 当超过时,内核不会将页面从活动状态移动到非活动状态。 一个页面也可以通过一些其他的方式变得不活动,例如,如果你做了一个长时间的I / O,内核就会假定你不会使用这个内存,并且使它无法预防。 因此,您可以获得比目标更多的非活动页面,因为内核会将某些caching标记为“更有可能永远不会使用”,并让其以“上次使用”顺序进行作弊。

http://www.redhat.com/advice/tips/meminfo.html

最后,我发现这是一个更优雅的等价物:

 sed -n '/MemFree/s/.*MemFree:\s*\([0-9]*\) kB.*/\1/gp' /proc/meminfo