не удается создать поток: ресурс временно недоступен

#ruby-on-rails #ruby #multithreading #debian

#ruby-on-rails #ruby #многопоточность #debian

Вопрос:

Я запускаю параллельные тесты для проекта ruby on rails 5.2.x под Debian 10 на мощном сервере (16 ядер, 32 потока, 70 ГБ оперативной памяти), и я продолжаю получать эту ошибку;

 #<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)
  

Я запускаю ruby 2.6.6 через rbenv, версия 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 потоков.

Комментарии:

1. Возможно, на вашем компьютере не хватает памяти, или процессор загружен, или что-то в этом роде.

2. Я наблюдал за компьютером в HTOP, а также за загрузкой, компьютер не был так напряжен. У него все еще было 50 ГБ свободной памяти и куча доступной вычислительной мощности. Это двухпроцессорный Xeon с кучей оперативной памяти. Если я проведу тот же тест с firefox, который использует больше ресурсов, чем нормально. Похоже, что Chrome достигает предела в моей настройке.

Ответ №1:

Обнаружена проблема, поскольку все мои сеансы выполняются через ssh (через x2go), поскольку я работаю удаленно, как и все в 2020 году, мне пришлось установить следующее, чтобы ограничения работали;

/etc/ssh/sshd_config

 UsePAM yes
  

После выхода из системы и повторного входа теперь я могу без проблем запустить свой тест потоков, я даже попробовал с 9000 потоками, и это сработало.