【问题标题】:How does sort work out how much RAM there is?sort 如何计算出有多少 RAM?
【发布时间】:2014-07-05 00:32:17
【问题描述】:

如果我这样做

ulimit -v 200000

然后跑

sort largefile

我可以从top 看到,sort 最多使用 142232 Virt 和 92764 Res,但一段时间后这会减少更多。

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

【问题讨论】:

    标签: linux sorting memory


    【解决方案1】:

    如果您使用 GNU sort,答案是它会根据 the rlimits for data (set by ulimit -d) and RSS (set by ulimit -m) 以及 available memorytotal memory 的 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 限制了一些不同的东西。对吗?
    • sort 没有-S 选项选择默认大小,这在一定程度上受ulimit 影响(RLIMIT_DATA 由ulimit -d 设置,RLIMIT_RSS 由ulimit -m 设置),但也会受到您无法控制的其他变量的影响。 sort -S 让您消除歧义并准确说出您想要使用多少。
    • 是的,对不起,我的意思是别的。我可以看到 sort -S 200000 将 Res 限制为 200MB,但不限制 Virt(查看顶部)。但是 ulimit -v 200000 限制了 Virt,对吧?
    • 这将转到一个稍微不同的主题。虚拟内存限制最终控制了数据和 RSS 限制的数量,因为虚拟内存大小是“最终限制”。虚拟内存通常是无限的,因为它用于所有内容,而不仅仅是数据 - 共享库、可执行文件,以及用户关心的东西,如私有数据和内存中的部分 (RSS)。更多讨论请见A way to determine a process's “real” memory usage?
    • 例如,尝试在设置和不设置 ulimit -v 限制的情况下运行此命令:echo -n "VM limit = "; ulimit -v; yes | head -100000000 | sort -S 2000M | wc。这将告诉sort 它允许使用 2000 MB 作为其排序缓冲区。如果没有 VM 限制,它将能够使用该缓冲区,并且它会工作。如果有 VM 限制,即使它被指示使用 2000 MB,也不会被允许,并且进程会崩溃,例如sort: memory exhausted
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多