您好我开发了一个多线程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 / ..技巧没有帮助:)。
感谢。
答案 0 :(得分:1)
大多数VM可能仅适用于堆栈。当然,它是虚拟的,所以如果你不使用它就不会被提交。
(我想知道线程的默认堆栈大小是否与ulimit -s有关)
显然是的,据说 this other SO question
答案 1 :(得分:1)
您可以尝试使用drop in garbage collecting replacement for malloc(),看看是否能解决您的问题。如果是,找到泄漏并修复它们,然后摆脱垃圾收集器。
在大多数堆分析器和分析器(例如valgrind)不完全(如果有的话)支持的平台上追逐这些类型的问题是“有趣的”。
另一方面,鉴于约束..我假设你已经减少了默认的线程堆栈大小?我认为默认值是8M,你可能不需要那么多。如果您尚未调整,请参阅pthread_attr_setstacksize()。
修改强>:
您可以使用pthread_attr_getstacksize()检查默认堆栈大小。如果它是8M,你在线程创建过程中已经吹掉了你的天花板(正如你所提到的那样,10个线程)。
答案 2 :(得分:0)
它升到那个水平并留在那里吗?或者它最终会耗尽内存?如果是前者,您只需找出一种方法来设置较小的工作集。如果是后者,则会发生内存泄漏并需要修复它。