ruby-on-rails - 无法创建线程:资源暂时不可用
问题描述
我在功能强大的服务器(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 个线程没问题。
解决方案
发现了问题,因为我的所有会话都通过 ssh(通过 x2go)运行,因为我在 2020 年像所有人一样远程工作,我必须设置以下内容才能使 ulimits 工作;
/etc/ssh/sshd_config
UsePAM yes
注销并重新登录后,我现在可以毫无问题地运行我的线程测试,我什至尝试了 9000 个线程并且它工作正常。
推荐阅读
- sql - 使用 SQL 将 MS Access 信息返回到 Excel 电子表格
- php - Symfony 没有用户令牌,或者您忘记将控制器放在防火墙后面 @Security
- google-apps-script - 我如何显示带有超链接的图像?
- php - 使用 hubspot api 的 PHP curl 代码适用于多个订单,但有时会突然失败而没有任何响应
- python - 收敛到相同种群的遗传算法的交叉
- python - 如何获得上述人物的 3D 图?
- c# - ASP.NET Core 5.0 - 带颜色的全尺寸列
- mysql - 我可以根据按值分组为我的计数添加条件吗
- salesforce - docusign 签名的信封在 Salesforce 中保存了两次
- c# - DataTable 到 Html 表在 Gmail 上作为邮件发送