从man time
:
M Maximum resident set size of the process during its lifetime, in Kilobytes.
从ulimit -a
:
max memory size (kbytes, -m) unlimited
但一个“千字节”可能表示 1000 或 1024 字节。我猜这是一轮 1024,但我想确定一下。权威参考将不胜感激。
答案1
它是千字节 (1024),这些是getrusage()
/ setrlimit()
API 的原始接口。这些文档不准确(或者如您所说的老派)。
另请注意,资源限制/核算及其单位因系统而异,您会发现 shell 在某些系统上出错的情况并不少见(不按记录的方式运行)。您会发现某些 shell 进行了一些额外的缩放,以适应这种情况或与 BSD csh 中的原始实现兼容,但无论如何,支持的 KMGTPE 后缀始终基于 1024,而不是基于 1000。
它让我想起我有一个建议的 zsh 补丁涵盖这一点以及我需要完成的更多内容。
你会看到的那里的代码明确说明每种资源的单位。
typedef struct resinfo_T {
int res; /* RLIMIT_XXX */
char* name; /* used by limit builtin */
enum zlimtype type;
int unit; /* 1, 512, or 1024 */
char opt; /* option character */
char* descr; /* used by ulimit builtin */
} resinfo_T;
[...]
{RLIMIT_RSS, "resident", ZLIMTYPE_MEMORY, 1024,
'm', "resident set size (kbytes)"},
对于 RSS 限制。
还要注意除 Darwin/macos 之外,%M
zsh 关键字的单位在所有系统上都是错误的time
。
独立的 GNUtime
实用程序(许多 shell 有自己的time
关键字),了解 Darwin/macOS 和其他系统之间的不同单位。