【问题标题】:How can I reduce the memory footprint of a minimal Linux process如何减少最小 Linux 进程的内存占用
【发布时间】:2023-03-07 23:16:01
【问题描述】:

考虑以下 C 程序,“pause.c”:

void main() { pause(); }

在 x64 Linux 3.0.0-16-generic 上使用此命令 'gcc -Os pause.c -o pause' 编译它会生成大小约为 8KB 的可执行文件。当我运行这个可执行文件并使用“pmap -d PID”检查它的精确内存占用时,它显示分配给进程的私有内存为 192KB(通常在不同系统之间变化,在 128KB 和 192KB 之间)。

使用 valgrind 和 massif 检查进程未能检测到任何内存分配事件。我怀疑 192KB 的数字是否准确,但我发现启动 5 个“暂​​停”进程实例确实消耗了大约 1MB 的系统内存。

我无法解释这个内存的来源,谁能提供一些关于为什么分配这个内存以及任何可能减少它的潜在行动的见解?,干杯。

【问题讨论】:

  • 首先检查 ELF 可执行文件;你会在那里找到很多东西(数据/代码部分、调试、cmets 等)。另请记住,您的程序至少与 libc 相关联;那里有很大的空间。
  • 好的,二进制的基本大小是 8KB,pmap 实用程序将链接开销考虑在内,192KB 的数字仅来自程序本身,当链接开销为考虑过,但这是共享内存,不是问题
  • 尝试摆脱 libc: void _start() { while (1) { } } 并使用 gcc -nostdlib pause.c 编译。这将减少内存使用量。
  • 然后在运行二进制文件之前将堆栈大小限制为 12 个字节(ulimit -s 12)
  • 啊,ulimit 命令成功了!,它已降至 12kb,显然占用空间主要是由默认堆栈分配造成的,请详细说明此效果,我会接受

标签: c linux memory memory-footprint


【解决方案1】:

减少堆栈限制会降低内存占用:

ulimit -s 8

【讨论】:

  • setrlimit 将以编程方式做同样的事情
  • 不完全一样! setrlimit 将为当前进程设置限制,但堆栈将被分配......所以父进程必须调用 setrlimit (这就是 ulimit 所做的),然后使用小的预分配堆栈生成新进程。如果我错了,请纠正我。
  • 使用dietlibc可以显着降低glibc的开销,唯一的问题是所有相关组件都必须针对dietlibc(比如openssl)fefe.de/dietlibc
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多