【问题标题】:Running Out of Threads on Debian在 Debian 上耗尽线程
【发布时间】:2017-10-04 19:32:44
【问题描述】:

我有一个程序可以在我的 debian 机器上创建指定数量的活动线程。当我尝试创建超过 100 的任何内容时,当它达到操作系统限制并且机器不接受任何传入连接并且执行命令时出现“-bash:fork:无法分配内存”时,我收到一条错误消息“创建线程时出错” .查看顶部命令,我看到任务在 32564 处达到最大值,并且只有 20% 的 RAM 被使用。我尝试将 ulimit -a & -n 编辑为 500000 并将 -s 编辑为 81920 但仍然没有做任何事情。非常感谢任何帮助/。

【问题讨论】:

  • 为什么不增加最大用户进程数(ulimit -u)?
  • 可能是一些PAM 限制。查看/etc/security/limits.confetc)。但是创建 100 个 runnable 线程是不合理的,除非您拥有昂贵的多套接字服务器。
  • 真的需要超过 100 个线程吗?请记住,操作系统仍然必须将这些线程与其他线程交换。除非您可以告诉操作系统专门在单独的内核上执行线程,否则它仍然必须将您的线程与其他进程交换。
  • 对不起,那是我的错字。我将 ulimit -u & -n 值增加到 500000。我正在尝试最大化我的服务器功能,因此我正在尝试创建尽可能多的线程。现在我的内存利用率为 20%,CPU 利用率为 10%,但操作系统设置似乎是瓶颈。一旦我弄清楚如何调整这些设置,我就会放大或缩小。

标签: c++ linux multithreading bash threadpool


【解决方案1】:

根据我自己的经验,在使用线程时,提高 CPU 绑定进程性能的一个很好的经验法则是使用相同数量的线程作为内核,除非是在超线程系统的情况下,在这种情况下应该使用核心数的两倍。可以得出的另一条经验法则是针对 I/O 绑定进程。这条规则是将每个内核的线程数增加四倍,除了超线程系统的情况外,每个内核的线程数可以增加四倍。所以无论如何你可能不应该制作100个线程。做“足够”就好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2016-12-26
    • 2013-06-09
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多