http://i002.radikal.ru/0910/f5/93d5125a40c1.png
Есть машина с четырёхъядерным процессором (AMD) и довольно большим количеством процессов, каждый из которых не слишком сильно нагружает процессор. Большинство нагрузки при этом почему-то падает на одно из ядер, остальные загружены гораздо меньше (см. скриншот).
Вопрос: почему не поровну и как сделать, чтобы распределялось более равномерно?
Примечание:
corochoone:
> Система сама автоматические выполняет балансировку, направляя очередной процесс на наименее загруженый процессор.
Ну так в этом и вопрос — почему ж не выполняет-то? 700-900 процессов — казалось бы, какая проблема в направлении их на менее загруженные ядра? Нет, нагрузка сгрудилась на одном ядре и не размазывается...
Дополнительная информация:
server:/home/user# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 16 0 0 0 IO-APIC-edge timer
1: 0 0 0 8 IO-APIC-edge i8042
6: 0 0 0 2 IO-APIC-edge floppy
8: 0 0 0 1 IO-APIC-edge rtc
9: 0 0 0 0 IO-APIC-fasteoi acpi
12: 0 0 0 4 IO-APIC-edge i8042
14: 0 1 361 110925 IO-APIC-edge pata_atiixp
15: 0 0 0 0 IO-APIC-edge pata_atiixp
16: 0 0 0 2 IO-APIC-fasteoi ohci_hcd:usb3, ohci_hcd:usb4
17: 0 0 0 0 IO-APIC-fasteoi ehci_hcd:usb1
18: 0 0 0 3 IO-APIC-fasteoi ohci_hcd:usb5, ohci_hcd:usb6, ohci_hcd:usb7
19: 0 0 0 0 IO-APIC-fasteoi ehci_hcd:usb2
22: 0 0 0 0 IO-APIC-fasteoi ahci
510: 2 185 354313 134935944 PCI-MSI-edge eth0
NMI: 0 0 0 0 Non-maskable interrupts
LOC: 5368834 5368819 5368791 5368763 Local timer interrupts
RES: 37629704 84821305 100436613 3347765 Rescheduling interrupts
CAL: 10880 10666 10996 11375 function call interrupts
TLB: 10115 6636 4704 2189 TLB shootdowns
TRM: 0 0 0 0 Thermal event interrupts
THR: 0 0 0 0 Threshold APIC interrupts
SPU: 0 0 0 0 Spurious interrupts
ERR: 0
server:/home/user#
510-е IRQ можно перетащить на 0-е, к примеру, ядро с помощью /proc/irq/510/smp_affinity, но ПОЧЕМУ оно не обрабатывается на всех ядрах равномерно?
Примечание:
agronom:
> На скриншоте 67%, другие ядра загружены по 5-7%. Где тут 100%-я загрузка?
Если нужно распределить работу _одной_ программы на 4 ядра, то в этой программе должна быть реализована многопоточность
(т.е. программой запускаются отдельные процессы, которые контролируются основным).
Ну не говорил я ни того, ни другого. Ни про 100% нагрузку, ни про распараллеливание ОДНОЙ программы. Читайте внимательнее — я спрашиваю, как добиться РАВНОЙ вычислительной нагрузки на всех ядрах, и почему этого не происходит автоматически. Понимаете?
А она сейчас различается на порядок. При том, что перекинуть сотню-другую процессов на относительно незагруженные ядра CPU вроде как проблем составлять не должно. Ну или создавать новые процессы на незагруженных ядрах. Однако же этого не происходит.
Примечание:
yggdrasill, спасибо за совет. Заскучаю — обязательно попробую его в деле.
Хотел бы уточнить, что 1) первая часть моего вопроса не о починке; 2) Вопрос в целом появился после и в результате «поломки», хотя это в нём и не отражено. Так что Ваша добрая ирония немного не в тему.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.