我需要测试一个内存管理过程。
limitmemory 400k -p <pid>有没有办法在unix中做到这一点?任何常见的 Unix 实用程序都很棒。
我有一个设置 -e 的 bash 脚本,因此脚本将在任何退出状态下退出!= 0。
我正在尝试执行一些分配给变量的基本 shell 算术,有时表达式等于 0,这会导致 let 或 expr 命令的退出状态为“1”。
下面是一个例子:
#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"
Run Code Online (Sandbox Code Playgroud)
输出是:
$ ./test_error.sh
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo …Run Code Online (Sandbox Code Playgroud) 关于限制单个进程的资源有很多问题和答案,例如RLIMIT_AS可以用来限制进程分配的最大内存,可以看成是VIRT之类的top。有关该主题的更多信息,例如这里有没有办法限制特定进程在 Unix 中可以使用的内存量?
setrlimit(2) 文档说:
通过 fork(2) 创建的子进程继承其父进程的资源限制。跨 execve(2) 保留资源限制。
应该这样理解:
如果一个进程的 RLIMIT_AS 为 2GB,那么它不能分配超过 2GB 的内存。当它产生一个子进程时,2GB 的地址空间限制将传递给子进程,但从 0 开始计数。这两个进程一起最多可以占用 4GB 的内存。
但是,限制整个进程树分配的内存总量的有用方法是什么?
本文声称该-m标志ulimit在现代 Linux 中没有任何作用。我找不到其他任何东西来证实这一说法。它准确吗?
您可以尝试通过设置最大驻留集大小 (ulimit -m) 来限制进程的内存使用。这对 Linux 没有影响。man setrlimit 说它曾经只适用于古代版本。您应该限制最大虚拟内存量 (ulimit -v)。
如果它确实在旧版本的 Linux 中工作,那么哪个版本停止支持它?
有时,我的 GNU/Linux 桌面上的某些进程(例如 gv 和 gnash)会耗尽物理内存并导致抖动。由于这些进程并不重要,如果它们使用太多内存,我希望它们被自动杀死。
我认为 /etc/security/limits.conf 文件和 -v 选项可以用于此目的。问题是它是限制特定用户每个进程的可用内存量,还是限制用户所有进程的总和。另外我想问一下如何在不重新启动的情况下对该文件进行有效更改。
有没有办法让我的 SSH 服务器及其下的所有内容(包括 bash)在重负载下始终可用?
也许它可能是某种关键路径,全部在内存中,具有专用 CPU 或类似的东西。
我可以以最低成本拥有一个始终可用的服务器来调查我的服务器上发生了什么事情的方法是什么?
我有一台带有交换分区的标准 Linux(Debian 测试)笔记本电脑。
我用它做了很多实验。其中一些真的很占用内存,Linux 默认的行为方式对我来说是一个问题......让我们举一个愚蠢的例子:
python,然后a = [0]*100000000现在很可能您没有足够的 RAM 来处理那个大列表。Linux 将填充 RAM,然后进行交换,几分钟后,OOM 杀手将被触发并终止(几乎)随机服务,并且希望,如果您在合适的时间按下 Ctrl+C python,并且如果终端仍然有焦点,计算机将再次响应。
我想强制执行一些内存限制以避免不必要的交换并拒绝进程分配比我拥有的内存(在 RAM 中)更多的内存的权利。如果内存需求低于某个限制或被 root 询问,那么就杀死除 root 之外的任何用户的最耗内存的进程。
ulimit -Sv [mem] 我在后面听到了!
呵呵!“使用cgroups通过cgexec!” 第一排有人说!
是的,您是对的:这些确实是非常好的解决方案。但:
我想要的是内核说:“你属于用户foo(不是 root),你使用了很多内存,我们会用完内存。对不起,伙计......死吧!”
或者:“你到底在做什么?你需要x MB 而只有y MB 可用。是的,SWAP 是空的,但你不打算使用 SWAP 来做你的脏活,是吗?不,我说不!没有你的记忆!如果你坚持,你会死的!
在问题限制单个 Linux 进程的内存使用中提到更改文件/etc/default/grub以便GRUB_CMDLINE_LINUX_DEFAULT包含
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
Run Code Online (Sandbox Code Playgroud)
有什么作用swapaccount=1?应用它有什么风险或缺点吗?
我们有一个进程在最近几周发生了一次性内存泄漏,导致它消耗了我们 RHEL 7 机器上的所有内存
我们现在希望对此设置限制,以便它永远不会超过一定数量
我们使用 ulimit -v 设置来设置这个数量(因为 -m 设置不起作用)
因此,我想知道这是否足够,还是我们还需要一种限制物理内存的方法?如果是这样,最好的方法是什么?
如果虚拟内存总是随着物理内存增长,那么 -v 本身就足够了