排序如何确定有多少RAM可用?

3

如果我执行

ulimit -v 200000

然后运行

sort largefile

我可以从top中看到,sort使用的最多是142232个Virt和92764个Res,但是经过一段时间后,这个值会进一步降低。

  1. sort如何知道设置的ulimit限制是多少?
  2. 为什么它不会使用我给它的全部 200MB?

注:ulimit 是一个能够控制 shell 进程在工作时所能占用的系统资源数量的命令。其中-v 参数用于限制进程虚拟内存的大小。Sort 是一个 Unix 命令,用于对文本文件进行排序操作。top 命令用于实时监控系统中各个进程的资源占用情况。
1个回答

8
如果您正在使用GNU sort,那么答案是它会根据数据的rlimits(由ulimit -d设置)和RSS(由ulimit -m设置)以及可用内存总内存的sysconf值计算默认值。不管您的ulimit如何, 默认内存大小都不会超过当前可用内存的3/4或总内存的1/8,以较大者为准。
/* Let MEM be available memory or 1/8 of total memory, whichever
   is greater.  */
double avail = physmem_available ();
double total = physmem_total ();
double mem = MAX (avail, total / 8);

/* Leave a 1/4 margin for physical memory.  */
if (total * 0.75 < size)
 size = total * 0.75;

使用GNU sort,您可以使用-S选项来指定排序缓冲区大小:
   -S, --buffer-size=SIZE
          use SIZE for main memory buffer

这个值可以是千字节的数字,也可以加上另一个单位(例如-S 100M),或者是总内存的百分比(例如-S 55%)。

这是一个很好的答案。谢谢你。ulimit -v 200000 限制虚拟内存,但 sort -S 200000 限制不同的东西。是这样吗? - Simd
使用sort命令时,如果没有使用-S选项,则会选择默认大小,该大小在某种程度上受ulimit的影响(RLIMIT_DATAulimit -d设置,RLIMIT_RSSulimit -m设置),但也受其他无法控制的变量的影响。使用sort -S可以消除歧义,确切地指定要使用的大小。 - Stuart Caie
是的,抱歉我表达有误。我可以看到 sort -S 200000 限制了 Res 的大小为200MB,但并没有限制 Virt(通过 top 命令查看)。而 ulimit -v 200000 则限制了 Virt,对吗? - Simd
1
这里转到一个稍微不同的话题。虚拟内存限制最终控制着数据和 RSS 限制的大小,因为虚拟内存大小是“终极限制”。虚拟内存通常被保留为无限制,因为它用于所有内容,而不仅仅是数据 - 共享库、可执行文件以及用户关心的私有数据和内存中的部分(RSS)。请参见 A way to determine a process's “real” memory usage? 获取更多讨论! - Stuart Caie
举个例子,尝试运行以下命令,分别设置和不设置ulimit -v限制:echo -n "VM limit = "; ulimit -v; yes | head -100000000 | sort -S 2000M | wc。这将告诉sort它可以使用2000 MB的排序缓冲区。如果没有虚拟内存限制,它将能够使用该缓冲区,并正常工作。如果有虚拟内存限制,即使已经被指示使用2000 MB,它也将无法使用,进程将崩溃,例如sort: memory exhausted - Stuart Caie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接