【问题标题】:can't create Thread: Resource temporarily unavailable无法创建线程:资源暂时不可用
【发布时间】:2020-11-04 04:28:51
【问题描述】:

我正在一台功能强大的服务器(16 核、32 线程、70GB 内存)上对 Debian 10 下的 ruby​​ on rails 5.2.x 项目运行并行测试,但我不断收到此错误;

#<Thread:0x000000000b9667d8@/usr/local/rbenv/versions/2.6.6/lib/ruby/2.6.0/webrick/utils.rb:163 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
    1: from /usr/local/rbenv/versions/2.6.6/lib/ruby/2.6.0/webrick/utils.rb:187:in `watch'
/usr/local/rbenv/versions/2.6.6/lib/ruby/2.6.0/webrick/utils.rb:187:in `start': can't create Thread: Resource temporarily unavailable (ThreadError)

我正在通过 rbenv 运行 ruby​​ 2.6.6,google-chrome 版本:'86.0.4240.183-1 amd64'。有时有效,有时无效。

我已经检查了我系统上的线程限制;

全局最大线程数

% cat /proc/sys/kernel/threads-max
628996

用户最大线程数

ulimit -a

-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-m: resident set size (kbytes)      unlimited
-u: processes                       314498
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  64
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 314498
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited

更新:通过一个简单的例子重新制定错误

我创建了这个小脚本并不断调整线程,直到它抱怨同样的错误。

#!/usr/bin/env ruby
THREADS = 600
threads = []
pids = []

THREADS.times do
  t= Thread.new do 
    pid = spawn("echo 'hi';sleep 10;echo 'bye'")
    pids.push(pid)
    sleep 10
  end
  threads.push(t)
end

threads.each do |thread|
  thread.join
end

pids.each do |pid|
  `kill #{pid}`
end

这台计算机上有很多进程在运行,我认为在正常操作中我已经接近极限,所以当我去运行我的测试时,它通常无法创建线程。

作为不同的用户运行此脚本会返回不同的结果

作为我的用户,当我将线程设置为 600 时它会失败,但如果我登录到一个没有任何打开的用户,那么我可以运行 5000 个线程没问题。

【问题讨论】:

  • 可能只是您的计算机内存不足或处理器已最大化或其他原因。
  • 我在 HTOP 中观察了计算机和负载,计算机没有那么紧张。它仍然有 50GB 的可用内存和大量可用的处理能力。它是具有大量 RAM 的双 CPU Xeon。如果我对使用更多资源的 Firefox 进行相同的测试,那就没问题了。这开始看起来像 Chrome 正在达到我的设置限制。

标签: ruby-on-rails ruby multithreading debian


【解决方案1】:

发现了问题,因为我在 2020 年像所有人一样远程工作,所以我的所有会话都通过 ssh(通过 x2go)运行,我必须设置以下内容才能使 ulimit 工作;

/etc/ssh/sshd_config

UsePAM yes

注销并重新登录后,我现在可以毫无问题地运行我的线程测试,我什至尝试了 9000 个线程并且它成功了。

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多