在创建不同的基准测试时,我通常以最佳延迟为目标。大家都知道,访问堆中的内存比访问堆栈中的内存要昂贵得多。我们现在是在2021年,当我尝试ulimit -s
时,我看到我有8192kbs可用。不能再高点吗?
我想知道如何使用c代码设置它,发现setrlimit和getrlimit:
getrlimit()和setrlimit()系统调用分别获取和设置资源限制。每个资源都有一个相关的软限制和硬限制,由rlimit结构[…]
定义。
我找到了这个答案和这个答案,虽然它们都很有趣,但还有一些小事情我不明白:
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>
#include <errno.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main(int argc, char *argv[])
{
struct rlimit old, new;
struct rlimit *newp;
pid_t pid;
if (!(argc == 2 || argc == 4)) {
fprintf(stderr, "Usage: %s <pid> [<new-soft-limit> "
"<new-hard-limit>]n", argv[0]);
exit(EXIT_FAILURE);
}
pid = atoi(argv[1]); /* PID of target process */
newp = NULL;
if (argc == 4) {
new.rlim_cur = atoi(argv[2]);
new.rlim_max = atoi(argv[3]);
// newp = &new; // I comment this line to avoid messing up with the processes too much;)
}
/* Set CPU time limit of target process; retrieve and display previous limit */
if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
errExit("prlimit-1");
;
printf("Previous limits: soft=%lld; hard=%lldn", (long long) old.rlim_cur, (long long) old.rlim_max);
/* Retrieve and display new CPU time limit */
if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
errExit("prlimit-2");
printf("New limits: soft=%lld; hard=%lldn", (long long) old.rlim_cur, (long long) old.rlim_max);
//perror("error:");
exit(EXIT_FAILURE);
}
如果我在任何进程上尝试,我会看到,至少在Ubuntu 18.04和gcc编译中,当它试图检索当前和最大限制时,它将返回-1。这个-1返回值到底是什么?这是否意味着"设置为默认系统值"?或"未能检索";如果是"检索失败",原因是什么?为什么没有触发if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
?
Previous limits: soft=-1; hard=-1
然而,如果我取消评论newp = &new;
(评论的目的),那么我可以为进程设置一个新的值,当前和最大,没有问题,这是相当惊人的。我理论上可以设置的最大值是多少?我尝试了sudo gcc raise_stack.c && ./a.out 9194 8192 16384
,但我太害怕燃烧我的cpu尝试自己;)
New limits: soft=8192; hard=16384
提前感谢您帮助我更好地理解getlimit。
注意:避免"如果你必须提高你的堆栈内存,那么你正在做一些错误的事情"。这不是一个意见问题。
编辑:不知道在哪里设置errno来得到正确的结果
error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
Previous limits: soft=-1; hard=-1
error:: Success
New limits: soft=-1; hard=-1
error:: Success
我把它放在
后面long long a = prlimit(pid, RLIMIT_CPU, newp, &old);
perror("error:");
但仍然不是我正在寻找的ERRNO。
-1的值是RLIM_INFINITY,这意味着没有强加的限制。