Назад | Перейти на главную страницу

Таинственное ограничение ЦП за сеанс?

TL; DR: ресурсоемкие процессы разделяют ядра на многоядерном сервере, в то время как другие ядра простаивают, тогда как я ожидаю, что планировщик Linux будет равномерно распределять задания по ядрам. Что могло вызвать такое поведение?

В моей рабочей группе есть новый 4-ядерный сервер под управлением SuSE, который испытывает странное поведение планирования CPU, о котором не знал наш администратор (тот, кто устанавливал коробку) и, похоже, не может исправить. Надеюсь, вы все поможете мне определить причину этого странного поведения. Вот симптомы:

1) Кажется, что каждый сеанс SSH ограничен использованием одного ядра. Я тестировал это множеством способов, но самым простым было создание простой программы C с бесконечным циклом и запуск нескольких копий. Они всегда используют одно ядро, если запускаются из одного сеанса SSH, и я даже не могу контролировать, какое ядро; похоже, что он установлен во время входа в систему. Более того, даже при использовании нескольких одновременных сессий SSH единственные ядра, которые я могу использовать таким образом, - это ядра 0 и 3; 1 и 2 никогда не касаются, независимо от того, сколько сеансов или процессов я запускаю.

2) Если из сеанса SSH, подобного упомянутым выше, я запускаю свою программу с «nohup», чтобы отделить ее от текущего сеанса, она будет использовать другое ядро, чем остальные программы, запущенные из этого сеанса. Однако все программы, запускаемые nohup из одного сеанса SSH, снова будут совместно использовать ядро ​​друг с другом. Интересно, что эти запускаемые без поддержки программы всегда назначаются ядрам 1 и 2.

Ожидаемое поведение, конечно, - это то, что я всегда видел в других системах Linux (я в основном знаком с RHEL, Fedora и Ubuntu): я должен иметь возможность использовать все 4 ядра из одного сеанса с использованием или без использования nohup; кроме того, задания должны иногда переключаться между ядрами, чтобы равномерно распределить время загрузки между ними.

Вот пример двух процессов, работающих на одном ядре: http://i.imgur.com/K9rH3.png (Извините, я пока не могу публиковать изображения напрямую, хотя у меня достаточно доверия на других сайтах StackExchange). Обратите внимание, что каждый процесс «прожига» занимает 100% одного ядра, если выполняется изолированно, но здесь они по какой-то причине используют одно ядро, а три ядра простаивают. Также обратите внимание, что эти два процесса совместно использовали ядро ​​«Cpu3» более 20 минут без перехода на другое ядро ​​для балансировки нагрузки (это было после того, как изображение было снято; через 20 минут я перестал смотреть).

Моя первая мысль, когда я столкнулась с этой проблемой, заключалась в том, что действует "ulimit", но это не похоже на мой (по общему признанию, неопытный) глаз:

dmonner@bass:~> ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128465
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 13988192
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128465
virtual memory          (kbytes, -v) 40007280
file locks                      (-x) unlimited

Кроме того, /etc/security/limits.conf пуст (или, по крайней мере, не имеет строк, которые не являются комментариями), поэтому я не думаю, что это ограничения PAM.

У меня есть доступ к sudo на машине, и даже если я выполняю sudo su, а затем запускаю процессы, я точно так же ограничен в ядре.

Итак: есть ли у кого-нибудь идеи относительно того, что может вызвать такое поведение и как от него избавиться?

Планировщик Linux (если приложение не делает этого самостоятельно) никогда ничего не связывает с каким-либо конкретным ядром. На самом деле, как раз наоборот, в большинстве случаев планировщик будет перераспределять нагрузку между всеми ядрами, казалось бы, случайным образом. Это единственная часть ядра, которая имеет своего рода целостное представление о системе и пытается «оптимизировать» отклик / пропускную способность системы в соответствии с некоторыми эвристиками, что в конечном итоге проявляется как ядро, передающее процессы через ядра.

Вы должны явно привязать процессы к определенным ядрам через что-то вроде taskset(1) для этого. Можете ли вы предоставить доказательства того, что вы переживаете?