Имя: Пароль:
IT
Админ
Сказать службе выполняться на таких-то ядрах, Вин.
0 Живой Ископаемый
 
09.06.11
17:47
Ролик:
http://screencast.com/t/DuqrIxUjCsi

Есть какой-то способ указать извне, из Винды и НЕ интерактивно, а скажем на этапе старта выполняться службе на таком-то и таком-то ядре - то есть тоже самое что в ролике  я делаю интерактивно.

Если нельзя на этапе старта, то может просто какая-то команда, которая указывает что вот такой-то процесс должен выполняться на таких-то ядрах....


Зачем: Есть несколько инстансов ДБ2 Експресс-Ц, на каждый которых есть ограничение - два ядра в рамках одного процессора. По умолчанию они все стартуют на ядрах 0,1.... для более старших редакций есть возможность указать значение переменной для инстанса какие ядра использовать. Для Експресс-Ц такой возможности нет. Ядер как видно - 8, хотелось бы равномерно инстансы по ним раскидать, но если перегрузилась вся железяка, то не делать это руками, а чтобы оно само... :)
1 Живой Ископаемый
 
09.06.11
17:48
куда-то все вопросительные знаки исчезли... :

Есть какой-то способ указать извне, из Винды и НЕ интерактивно, а скажем на этапе старта выполняться службе на таком-то и таком-то ядре - то есть тоже самое что в ролике  я делаю интерактивно?
2 smaharbA
 
09.06.11
20:05
на этапе старта
для проверки хватит
cmd /c start "" /affinity 0x1 mshta "javascript:new ActiveXObject('wscript.shell').Run('taskmgr');for(x=0;x<99999;x++){new ActiveXObject('wscript.shell').SendKeys('')};window.close();"

про службу надо зырить
3 Лефмихалыч
 
09.06.11
20:17
4 Живой Ископаемый
 
09.06.11
22:09
2(2,3) спасибо... но если это не будет большой наглостью, и если у вас найдется время, то хотелось бы именно про службу:
Например что где изменить в этой картинке
http://screencast.com/t/Czg5Z9965qOC


====
насколько я понял, меня касается вот эти строки:

If you’re trying to control a service, you could use instsrv/srvany to create a service that wraps the start or psexec command around the real service binary. For example, the commands below create another version of the spooler service that will only run on the first processor.

instsrv Test c:\util\srvany.exe
reg add hklm\system\currentcontrolset\services\test\Parameters
reg add hklm\system\currentcontrolset\services\test\Parameters /v Application /t reg_sz /d cmd.exe
reg add hklm\system\currentcontrolset\services\test\Parameters /v AppParameters /t reg_sz /d "/c start /affinity 1 C:\WINDOWS\system32\spoolsv.exe"

на выходных попробую
5 Лефмихалыч
 
09.06.11
23:08
(4) службе, как таковой, нет способа указать афинити. Можно сделать трюк-из-брюк - запускать службу с помощью команды

cmd.exe /c start /affinity 1 c:\progra~1\IBM\бла-бла-бла\bd2syscs.exe

должно в теории заколоситься, если SCM службу не замочит, не получив от нее чо-нибудь там по хэндлу, т.к. хэндл у CSM будет от cmd.exe, а не от bd2syscs.exe (но это домыслы - как оно там со службами в венде устроено, я все, что знал, давно забыл).

Еще возможно поможет виртуализаяйца - назначить виртуалке нужные процессоры.
6 Torquader
 
09.06.11
23:47
SetProcessAffinityMask
The SetProcessAffinityMask function sets a processor affinity mask for the threads of a specified process.

A process affinity mask is a bit vector in which each bit represents the processor on which the threads of the process are allowed to run.

The value of the process affinity mask must be a proper subset of the mask values obtained by the GetProcessAffinityMask function.

BOOL SetProcessAffinityMask(
 HANDLE hProcess,             // handle to process
 DWORD dwProcessAffinityMask  // process affinity mask
);

Можно открыть идентификатор процесса и задать ему нужные настройки (то есть нужно сделать другую службу, которая будет "рулить" вашей).
7 Лефмихалыч
 
09.06.11
23:55
о, прикольно, - общими усилиями мы оптимизировали количество служб до двух :)
8 Torquader
 
10.06.11
01:03
Единственное что - служба запускается через менеджер служб (к которому она подключается при старте процесса) есть вероятность, что этот менеджер работает на одном процессоре для всех служб и на других не захочет - он это просто проверяется - если всё "свисло", то значит - не вышло.

Запуск службы происходит с следующей последовательности:
1) Система загружает в память и запускает процесс, который обслуживает службу (в процессе может быть несколько служб).
2) Процесс вызывает подключение к менеджеру служб и передаёт ему список поддерживаемых служб с адресами процедур для их старта.
3) Менеджер выбирает необходимую службу и вызывает переданную ему функцию (надо смотреть ThreadId, так как, может быть, она вызывается через CreateRemoteThread).
4) Процедура начинает исполняться, проводит инициализацию службы, регистрирует процедуру обработки событий управления службой и сообщает системе состояние и данные службы.
5) Система может управлять службой (то есть на данном этапе можно перенести службу на другие процессоры).

Также можно "отловить" каждый поток и назначить процессор для него:
SetThreadAffinityMask
The SetThreadAffinityMask function sets a processor affinity mask for a specified thread.

A thread affinity mask is a bit vector in which each bit represents the processors that a thread is allowed to run on.

A thread affinity mask must be a proper subset of the process affinity mask for the containing process of a thread. A thread is only allowed to run on the processors its process is allowed to run on.

DWORD SetThreadAffinityMask (
 HANDLE hThread,             // handle to the thread of interest
 DWORD dwThreadAffinityMask  // a thread affinity mask
);

Или распределить его на нужный процессор (смысла в указании для одного потока более чем одного процессора нет, так как исполняться-то он будет только на одном из указанных процессоров).

SetThreadIdealProcessor
The SetThreadIdealProcessor function is used to specify a preferred processor for a thread. The system schedules threads on their preferred processors whenever possible.

DWORD SetThreadIdealProcessor(
 HANDLE hThread,         // handle to the thread
 DWORD dwIdealProcessor  // ideal processor number
);
9 Косяк
 
10.06.11
01:08
10 dka80
 
10.06.11
07:23
proccess lasso
В нем задать на каких ядрах работать процессу один раз. Затем он каждый раз сам будет перекидывать на нужное ядро
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший