【问题标题】:virtual memory consumption of pthreadspthreads的虚拟内存消耗
【发布时间】:2010-06-22 18:31:10
【问题描述】:

您好,我开发了一个多线程 TCP 服务器应用程序,它允许 10 个并发连接接收来自它们的连续请求,在处理一些请求后,将它们响应给客户端。我在基于 TI OMAP l137 处理器的板上运行它,它运行 Monta Vista Linux。每个客户端创建线程,即 10 个线程,并且它是预线程的。根据 ps、top 和 meminfo,它的物理内存使用率约为 %1.5,CPU 使用率约为 %2。它的 vm 使用率上升到 80M,而我有 48M(我将它从 u-boot 减少到为 DSP 保留一些内存)。任何帮助表示赞赏,我该如何减少它??(/proc/sys/vm/.. 技巧无济于事:)

谢谢。

【问题讨论】:

    标签: linux embedded network-programming posix pthreads


    【解决方案1】:

    您可以尝试使用drop in garbage collecting replacement for malloc(),看看是否能解决您的问题。如果是,请找出漏洞并修复它们,然后摆脱垃圾收集器。

    在大多数堆分析器和分析器(例如 valgrind)不完全(如果有的话)支持的平台上解决这类问题是“有趣的”。

    另一方面,考虑到约束.. 我假设您减少了默认线程堆栈大小?我认为默认是8M,你可能不需要那么多。如果您还没有调整,请参阅pthread_attr_setstacksize()

    编辑

    您可以使用pthread_attr_getstacksize() 检查默认堆栈大小。如果它是 8M,那么您在线程创建期间已经突破了上限(正如您提到的 10 个线程)。

    【讨论】:

    • ulimit 没有帮助我会尝试 pthread_attr_setstacksize() 我认为它是默认值,如果它不是由内核配置设置的。
    • @yet ,那么每个线程可能有一个 4 或 8 MB 的堆栈。您可以使用 pthread_attr_getstacksize() 查看默认值。
    • 谢谢!虚拟内存使用情况现在很好,谢谢。
    【解决方案2】:

    大多数 VM 可能只是用于堆栈。当然,它是虚拟的,所以你不使用它就不会被提交。

    (我想知道线程的默认堆栈大小是否与ulimit -s有关)

    显然是的,根据 this other SO question

    【讨论】:

    • yes ulimit 详细说明它是无限制的,我今天早上试过它没有帮助,我会尝试设置一些线程特定的限制。
    【解决方案3】:

    它会上升到那个水平并保持在那里吗?还是它最终会耗尽内存?如果是前者,您只需要想出一种方法来拥有更小的工作集。如果是后者,你有内存泄漏,需要修复它。

    【讨论】:

    • 它停留在那里并且可以正常工作一天,但 48 小时后它被魔法力量杀死,我找不到任何线索。 dmesg,其他日志是干净的,这个过程刚刚结束。
    • 我敢打赌,“神奇的力量”是您的内存泄漏导致您的应用程序耗尽其堆。
    • 谢谢顺便说一句,如果它被 OOM-Killer 杀死,我在哪里可以找到日志?正如我所说,它就像一只神奇的手阻止它。 (我仔细检查了登录信息:)
    • 哪种语言?如果 C 然后检查每个 malloc() 的返回值,如果 NULL 你应该记录它。如果是 C++,请确保您使用的是 new (nothrow),然后执行相同操作。否则,请尝试...catch 每个新的并在任何一种情况下记录分配失败。
    • 它是 ANSI C,我会检查 'errno' 但我认为,你所说的,会导致内存损坏和分段错误,而不是内存泄漏。
    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2014-04-23
    • 2012-08-05
    • 2014-05-14
    • 2013-01-28
    • 2017-12-16
    相关资源
    最近更新 更多