为什么 free 命令报告的内存使用量与 cgroup 的内存使用量有很大不同?
$ free -b
total used free shared buff/cache available
Mem: 2096914432 520863744 1112170496 35389440 463880192 1356828672
Swap: 2145382400 0 2145382400
$ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
857239552
Run Code Online (Sandbox Code Playgroud)
cgroups 的文档说 memory.usage_in_bytes 是一个“模糊值”。我猜这只是意味着它报告的估计值接近实际值。即使这是一个估计,我认为也不应该相差这么远。
我在 VirutalBox 虚拟机中运行 Linux Mint 18.2。
我正在运行一个没有交换的 Linux 工作站,并且我已经安装了earlyoom守护进程,以便在 RAM 不足时自动终止一些进程。它earlyoom通过监视内核MemAvailable值来工作,如果可用内存变得足够低,它会杀死不太重要的进程。
这已经工作了很长一段时间,但突然间我遇到了MemAvailable与系统其他部分相比突然非常低的情况。例如:
$ grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached):' /proc/meminfo
MemTotal: 32362500 kB
MemFree: 5983300 kB
MemAvailable: 2141000 kB
Buffers: 665208 kB
Cached: 4228632 kB
Run Code Online (Sandbox Code Playgroud)
请注意 MemAvailable 远低于MemFree+ Buffers+ Cached。
我可以运行任何工具来进一步调查为什么会发生这种情况吗?我觉得系统性能比正常情况要差一些,我不得不停止该服务,因为除非稳定(即它正确地描述了用户模式进程的可用内存),earlyoom否则它的逻辑将无法工作。MemAvailable
根据https://superuser.com/a/980821/100154 MemAvailable 是对可用于启动新应用程序(无需交换)的内存量的估计。由于我没有交换,这是什么意思?这是否意味着在触发 OOM Killer 之前新进程可以获取的内存量(因为这在逻辑上会遇到“交换已满”的情况)?
我曾假设MemAvailable>=MemFree总是正确的。不在这里。
附加信息:
在互联网上搜索表明,原因可能是打开的文件不受文件系统支持,因此无法从内存中释放。该命令sudo lsof | wc -l输出653100所以我绝对无法手动浏览该列表。
顶部sudo slabtop说
Active / Total Objects (% used) …Run Code Online (Sandbox Code Playgroud) 我想监视四台机器上的可用内存,每台机器都运行 Windows Server 2003 R2 SP2 64 位。每个盒子有 31.7GB 的 RAM。我想定期运行一个命令行工具,这样我就可以收集输出,然后用它制作图表。
我使用 Cygwin 定期运行了一些测试并收集了 vmstat 输出。我看到这样的数字:
0 0 1235228 4194303 0 0 0 0 0 0 4652 3089 1 5 94 0
0 0 1235228 4194303 0 0 0 0 0 0 4718 7591 5 4 91 0
0 0 1235228 4194303 0 0 0 0 0 0 5027 7816 5 4 92 0
0 0 1235228 4194303 0 0 0 0 0 0 4886 7099 3 3 93 0 …Run Code Online (Sandbox Code Playgroud) windows-server-2003 performance-monitoring vmstat diagnostic memory-usage
我有一个休闲问题:Apache 每个孩子吃很多 ram。
闲置的评论显示:
cat /etc/redhat-release -- Fedora 8 (狼人)
免费-m:
Run Code Online (Sandbox Code Playgroud)total used free shared buffers cached Mem: 3566 3136 429 0 339 1907 -/+ buffers/cache: 889 2676 Swap: 4322 0 4322
我知道你会说没有什么可担心的,因为交换不使用,但我认为它现在不使用。
3.httpd -v:
服务器版本:Apache/2.2.14 (Unix)
4.httpd -l:
在模块中编译:
核心文件
mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c
mod_include.c
mod_filter.c
mod_log_config.c
mod_env.c
mod_setenvif.c
mod_version.c
mod_ssl.c
前叉
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c
5.加载的动态模块列表:
LoadModule authz_host_module
模块/mod_authz_host.so LoadModule
include_module 模块/mod_include.so
LoadModule log_config_module
模块/mod_log_config.so LoadModule …
我pgrep apache2在运行 Apache 的 ubuntu 10.4 上尝试了 pmap |grep total 并且 o/p 是这样的:
总计 47768K
总计 48048K
总计 48048K
总计 48048K
总计 48048K
总计 48048K
这是否意味着每个子进程占用 48 MB 的内存。你能帮我找到每个进程的确切内存使用情况吗。期待回复
我在具有 16GB RAM 的 8 核 PC 上运行一个小型 Debian 计算集群。我正在运行大约 1k 个任务的批次(每个批次的总预期时间为一个月)。单个任务是单线程的(因此我可以在每台 PC 上并行运行多个任务),不消耗太多 IO(启动时加载几兆字节的数据,退出时转储几兆字节的数据;不与外界通信否则),它的运行时间是未知的(从几分钟到~一周),它的内存消耗是未知的(从几兆字节到~8GB;使用可能会缓慢或快速增长)。我想在一台 PC 上并行执行尽可能多的此类任务,但我想避免过度交换。
所以我有了一个想法:我可以监视这些任务的内存使用情况,并暂停 ( kill -SIGSTOP) 或休眠(使用像CryoPID 之类的工具)任务,这些任务消耗了太多内存,无法稍后重新启动。我所说的内存使用是指“活动虚拟页面”的数量,或分配的数量,而不是实际被触及的共享内存页面(这些任务可能会在不使用它们的情况下分配内存)。
我开始寻找一些工具来做到这一点。我知道我可以ulimit或在内存受限的 cgroup 中运行任务,但是——如果我理解正确的话——这些解决方案将终止进程而不是挂起它。我想避免杀死它们,因为稍后我需要从头开始,这意味着浪费时间。此外,它们实际上无法测量活动虚拟页面的数量。
我可以使用真正的虚拟机,但在这种情况下它们似乎有很大的开销——拥有单独的内核、内存分配等会减少可用内存;我必须运行其中的 8 个。此外,据我所知,他们也会增加计算开销。
我想,实现这种行为的工具会将某些功能与页面错误通知挂钩,该通知将决定每个页面错误是否是暂停进程的时间。但我也不知道有任何工具可以以这种方式工作。
还有其他选择吗?
假设我有一个 docker 主机,其中设置了 50 个容器,每个容器运行一个由 Apache 提供服务的站点。
据我了解,每个容器都会运行一个 Apache 实例,通常每个 Apache 实例每 ram 使用 ~250mb。Apache 然后每个子进程需要几 mb。
假设每个容器都需要完整 Apache 实例的内存,我是否正确?例如。50 个站点需要 50 x ~300mb?
或者 Apache 是否能够在容器之间共享部分内存以提高内存效率?
Docker 是否适合高效的“大规模”托管(例如,大量站点,每个站点都需要很少的资源),其中每个站点都是一个容器?或者只让一个 Apache 容器服务于 50 个站点是否可行?
我有一个进程在 Linux 上的 Docker 容器中运行,内存限制为 2GByte。(容器以 开头docker run --memory=2g。)
以下是top它运行一段时间后的情况。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9016 root 20 0 7342132 4.652g 4.224g S 100.0 7.4 18828:28 blah
Run Code Online (Sandbox Code Playgroud)
这是输出docker stats:
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
d7032e5928b6 100.02% 2.076 GB/2.147 GB 96.68% 345 MB/199.1 MB
Run Code Online (Sandbox Code Playgroud)
然后,重新启动后top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5653 root 20 0 2787800 …Run Code Online (Sandbox Code Playgroud) 我们有一个运行 R-Studio Server 的 Ubuntu Server (16.04),我们在其中进行统计模拟。这些模拟有时对 RAM 和 CPU 影响很大,所以我想知道内核如何分配内存和 RAM,例如,如果两个用户登录并且他们每个人都运行一个单独的 R 会话,在那里他们“竞争”内存和 CPU。
由于我们都不是服务器管理员,因此我们并不真的想应用手动更改,但是我们感兴趣的是 RAM 和 CPU 分配是否更不等于所有用户。
注意:R-Studio Server Pro 版本允许以非常简单的方式为单个用户分配给定数量的内存,但由于我们没有 Pro 版本,我们无法更改这些设置。
ubuntu memory central-processing-unit cpu-usage memory-usage
I have an AWS EC2 instance running a CentOS 7.7.1908 (systemd 219) with a server application. The server logs quite a lot of information to the system logs (using syslog).
I have recently enabled persistent storage of the system logs using this answer. Since then, the memory consumption of systemd-journald is constantly growing.
After a full day, systemd-journald ends up using more than 250M of RAM.
我做了一个快速测试来确认 Journald RAM 使用量实际上在增长。
测试 :
systemd-journald内存使用情况logger