具有特定百分比的 Stress-ng 压力记忆

Stress-ng stress memory with specific percentage

我正在尝试强调 ubuntu 容器的内存。在我的命令终端中输入 free 会提供以下结果:

free -m 

          total        used        free      shared  buff/cache   available     

Mem:           7958         585        6246         401        1126        6743                                         
Swap:          2048           0        2048   

我想强调总可用内存的 10%。每 stress-ng manual:

   -m N, --vm N
          start N workers continuously calling mmap(2)/munmap(2) and writing to the allocated
          memory.  Note  that  this  can cause systems to trip the kernel OOM killer on Linux
          systems if not enough physical memory and swap is not available.

   --vm-bytes N
          mmap N bytes per vm worker, the default is 256MB. One can specify the size as %  of
          total  available  memory  or in units of Bytes, KBytes, MBytes and GBytes using the
          suffix b, k, m or g.

       

现在,在我的目标容器上,我 运行 两个内存压力源占用了我 10% 的内存:

stress-ng -vm 2 --vm-bytes 10% -t 10 

但是,无论我 运行 多少次,容器上的内存使用率都不会达到 10%。我尝试了不同的超时值,没有结果。它得到的壁橱是 8.9%,从未接近 10%。我以这种方式检查容器上的内存使用情况:

 docker stats --no-stream kind_sinoussi
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O   PIDS
c3fc7a103929   kind_sinoussi   199.01%   638.4MiB / 7.772GiB   8.02%     1.45kB / 0B   0B / 0B     7

为了理解这种行为,我尝试 运行使用精确的字节单位执行相同的命令。就我而言,我会选择 800 mega,因为 7958m * 0.1 = 795,8 ~ 800m。

stress-ng -vm 2 --vm-bytes 800m -t 15

而且,我得到 10%!

 docker stats --no-stream kind_sinoussi
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O   PIDS
c3fc7a103929   kind_sinoussi   198.51%   815.2MiB / 7.772GiB   10.24%    1.45kB / 0B   0B / 0B     7

有人可以解释为什么会这样吗?

另外一个问题,stress-ng有没有可能把内存使用率压到100%?

stress-ng --vm-bytes 10% 将使用 sysconf(_SC_AVPHYS_PAGES) 来确定可用内存。此 sysconf() 系统调用将 return 应用程序可以使用的页面数,而不会妨碍任何其他进程。所以这大约是 free 命令return用于空闲内存统计的内容。

请注意,stress-ng 将使用 mmap 分配内存,因此可能在 运行 期间,当您检查正在使用多少实际内存时,mmap 页面可能不一定在物理上得到支持使用过。

可能也值得尝试使用 --vm-populate 选项;这将尝试确保页面物理填充在 stress-ng 正在执行的 mmap 内存中。还可以尝试 --vm-madvise willneed 使用 madvise() 系统调用来提示很快就会需要这些页面。