我有一个备份过程,它从磁盘读取大量数据,因此将所有内存用于磁盘缓存,在此过程中交换应用程序和其他缓存数据。备份完成后将备份数据保留在磁盘缓存中没有任何好处,因此我想限制内核可以为该进程缓存的数据量。是否可以?
谢谢,
我在具有 16GB RAM 的 8 核 PC 上运行一个小型 Debian 计算集群。我正在运行大约 1k 个任务的批次(每个批次的总预期时间为一个月)。单个任务是单线程的(因此我可以在每台 PC 上并行运行多个任务),不消耗太多 IO(启动时加载几兆字节的数据,退出时转储几兆字节的数据;不与外界通信否则),它的运行时间是未知的(从几分钟到~一周),它的内存消耗是未知的(从几兆字节到~8GB;使用可能会缓慢或快速增长)。我想在一台 PC 上并行执行尽可能多的此类任务,但我想避免过度交换。
所以我有了一个想法:我可以监视这些任务的内存使用情况,并暂停 ( kill -SIGSTOP) 或休眠(使用像CryoPID 之类的工具)任务,这些任务消耗了太多内存,无法稍后重新启动。我所说的内存使用是指“活动虚拟页面”的数量,或分配的数量,而不是实际被触及的共享内存页面(这些任务可能会在不使用它们的情况下分配内存)。
我开始寻找一些工具来做到这一点。我知道我可以ulimit或在内存受限的 cgroup 中运行任务,但是——如果我理解正确的话——这些解决方案将终止进程而不是挂起它。我想避免杀死它们,因为稍后我需要从头开始,这意味着浪费时间。此外,它们实际上无法测量活动虚拟页面的数量。
我可以使用真正的虚拟机,但在这种情况下它们似乎有很大的开销——拥有单独的内核、内存分配等会减少可用内存;我必须运行其中的 8 个。此外,据我所知,他们也会增加计算开销。
我想,实现这种行为的工具会将某些功能与页面错误通知挂钩,该通知将决定每个页面错误是否是暂停进程的时间。但我也不知道有任何工具可以以这种方式工作。
还有其他选择吗?
我对 sudo 有一个相当奇怪的问题。基本上,它进行身份验证,但有时只是不启动提供的命令。例如:
liori@marvin:~$ sudo whoami
root
liori@marvin:~$ sudo whoami
root
liori@marvin:~$ sudo whoami
liori@marvin:~$ sudo whoami
liori@marvin:~$ sudo whoami
liori@marvin:~$
Run Code Online (Sandbox Code Playgroud)
我写了一个测试用例来演示这个问题:
liori@marvin:~$ sudo whoami; for i in `seq 100`; do echo -n ':' ; sudo whoami ; done ; echo
root
::::::::::::root
:::::root
:::::root
:::::::::::root
::::::::::root
::::::::::::::::::::::::::::::::root
:::root
::::root
::::root
:::root
:::root
::root
:root
:::::
liori@marvin:~$
Run Code Online (Sandbox Code Playgroud)
当然,预期的输出是一系列行,每行都以一个冒号字符开头。我不知道从哪里开始调试这个问题。
对于每次尝试(无论命令是否实际运行),我都会在 syslog 中得到一个条目:
Apr 11 19:47:40 marvin systemd-logind[806]: New session c1079 of user root.
Apr 11 19:47:40 marvin systemd-logind[806]: Removed session c1079. …Run Code Online (Sandbox Code Playgroud)