【发布时间】:2014-07-05 00:32:17
【问题描述】:
如果我这样做
ulimit -v 200000
然后跑
sort largefile
我可以从top 看到,sort 最多使用 142232 Virt 和 92764 Res,但一段时间后这会减少更多。
- sort 如何知道 ulimit 限制设置为多少?
- 为什么它不使用我给它的所有 200MB?
【问题讨论】:
如果我这样做
ulimit -v 200000
然后跑
sort largefile
我可以从top 看到,sort 最多使用 142232 Virt 和 92764 Res,但一段时间后这会减少更多。
【问题讨论】:
如果您使用 GNU sort,答案是它会根据 the rlimits for data (set by ulimit -d) and RSS (set by ulimit -m) 以及 available memory 和 total 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%)
【讨论】:
sort 没有-S 选项选择默认大小,这在一定程度上受ulimit 影响(RLIMIT_DATA 由ulimit -d 设置,RLIMIT_RSS 由ulimit -m 设置),但也会受到您无法控制的其他变量的影响。 sort -S 让您消除歧义并准确说出您想要使用多少。
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