/sys/devices/system/cpu/cpuX/online должно работать.
Когда остается 1 CPU, ядро автоматом переключается на UP.
> Это я всё к зависательной теме на Pentium D. maxcpus=1 помогает железно.
> Ядро 3.0 не помогает. Прогуглился и пробую параметры ядра, но два разных
> варианта (clocksource=acpi_pm highres=off no_hz=off и
> skip_acpi_timer_override no_hz=off) привели к _более быстрому_ зависанию.
> Сейчас тестируется irqpoll, если повиснет - следующим будет notsc. Но этот
> номер всё-таки может не пройти.
acpi=off еще попробуй. Но это совсем грустно.
> Меня вполне устраивает работа системы с maxcpus=1 для всего, кроме просмотра
> HD media. В идеале можно было бы встроить в скрипты для просмотра (а они и
> так уже скрипты, на отдельный X screen показывают) включение второго CPU и
> затем отключение
А если во время просмотра зависнет?
> Однако нагугленное решение
> http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/вешает
> систему сразу. (Я загружался без maxcpus и пытался отключить второй
> процессор через echo 0 > /sys/devices/system/cpu/cpu1/online).
> Возможно ли такое на самом деле, или только через перезагрузку?
На исправном железе работает:
[158000.796138] CPU 1 is now offline
[158000.796147] SMP alternatives: switching to UP code
[158004.924321] SMP alternatives: switching to SMP code
[158004.935597] Booting Node 0 Processor 1 APIC 0x1
[158004.935605] smpboot cpu 1: start_ip = 99000
[158000.696216] CPU1: Thermal monitoring handled by SMI
[158005.032020] Switched to NOHz mode on CPU #1
--
WBR, Dmitry
> А всем подряд поставить affinity mask через schedtool -- не оно?
> (наследоваться при форк() будет).
>
> А как совсем всему поставишь включая ядрёные ;) процессы, которые,Нашёл только что в kernel-parameters:
> вероятно, и вешают?
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
Format:
<cpu number>,...,<cpu number>
or
<cpu number>-<cpu number>
(must be a positive range in ascending order)
or a mixture
<cpu number>,...,<cpu number>-<cpu number>
По описанию получается, что указанные CPU использоваться не будут, пока
явно туда что-то не засунуть (опять же через affinity mask).
- при загрузке isolcpus=1 означает: «по умолчанию ядро #1 оставь в
покое».
- про mplayer через schedtool или cpuset можно сказать: «а вот эту бяку
запусти на двух ядрах» (affinity mask 3).
Ну поставь тики на HZ=50000 -- вообще виснуть не будет ;-}}}
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110906160...@nano.ioffe.rssi.ru
> Спасибо, это вероятно то решение которое я искал. Будем пробовать. Пробовать> будем долгоЮ зависания случаются не сращу (ну кроме как с no_hz=off, с нимНу поставь тики на HZ=50000 -- вообще виснуть не будет ;-}}}
> почему-то виснем быстро).
Черт. Запутался в отрицаниях.
P.S. Я то думал тут логический пародокс, а он просто виснет под нагрузкой.
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110906171...@nano.ioffe.rssi.ru
> > > будем долгоЮ зависания случаются не сращу (ну кроме как с no_hz=off, с
Черт. Запутался в отрицаниях.
P.S. Я то думал тут логический пародокс, а он просто виснет под нагрузкой.
Уф. Давайте по порядку. Вы заметили на работающей системе процессор на двухядерный,
после чего начались зависания. Причем зависает только графический интерфейс.
Мануал к материнской плате явно указывает, что она совместима с этим процессором.
Установлен BIOS последней версии. Что Вы еще меняли кроме процессора?
Температура на процессоре, северном мосту, видеокарте, как я понял, в пределах нормы?
Попробуйте Quake3 в больших дозах и смотрите на температуру.
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110906211...@nano.ioffe.rssi.ru
> Прикол в том, что под реальной пользовательской нагрузкой (напримерУф. Давайте по порядку. Вы заметили на работающей системе процессор на двухядерный,
> напроигрывании HD) оно если и виснет, то не чаще чем без нагрузки. А от
> no_hz=off вдруг взяло и стало виснуть куда быстрее. Что бы это могло быть?
> При maxcpus=1 не виснет вовсе. Таки "подгоревшее" второе ядро - при
> исправном первом?
после чего начались зависания. Причем зависает только графический интерфейс.
Мануал к материнской плате явно указывает, что она совместима с этим процессором.
Установлен BIOS последней версии. Что Вы еще меняли кроме процессора?
Температура на процессоре, северном мосту, видеокарте, как я понял, в пределах нормы?
Попробуйте Quake3 в больших дозах и смотрите на температуру.
On Wed, Sep 07, 2011 at 01:14:11AM +0100, Mikhail Ramendik wrote:А напряжение на процессоре не проседает?
> >
> > Мануал к материнской плате явно указывает, что она совместима с этим
> > процессором.
> > Установлен BIOS последней версии. Что Вы еще меняли кроме процессора?
>
> Ни-че-го.
nvidia-settings должны показывать температуру
> >
> > Температура на процессоре, северном мосту, видеокарте, как я понял, в
> > пределах нормы?
> >
>
> Да. Хотя на северном мосту и видеокарте я её "замеряю" руками. На северном
On Tue, Sep 06, 2011 at 11:33:14AM +0100, Mikhail Ramendik wrote:/sys/devices/system/cpu/cpuX/online должно работать.
> Всем привет!
>
> Вопрос - а можно ли вот так развернуть линух на двухпроцессорной системе,
> чтобы он не использовал второй процессор, пока не сказали? А потом сказали
> ещё раз и снова видел один процессор.
Когда остается 1 CPU, ядро автоматом переключается на UP.
acpi=off еще попробуй. Но это совсем грустно.
А если во время просмотра зависнет?
> Меня вполне устраивает работа системы с maxcpus=1 для всего, кроме просмотра
> HD media. В идеале можно было бы встроить в скрипты для просмотра (а они и
> так уже скрипты, на отдельный X screen показывают) включение второго CPU и
> затем отключение
На исправном железе работает:
> Однако нагугленное решение
> http://www.cyberciti.biz/faq/debian-rhel-centos-redhat-suse-hotplug-cpu/вешает
> систему сразу. (Я загружался без maxcpus и пытался отключить второй
> процессор через echo 0 > /sys/devices/system/cpu/cpu1/online).
> Возможно ли такое на самом деле, или только через перезагрузку?
[158000.796138] CPU 1 is now offline
[158000.796147] SMP alternatives: switching to UP code
$ cat /proc/interruptsCPU0 CPU1
0: 45 1 IO-APIC-edge timer
1: 0 2 IO-APIC-edge i8042
3: 0 2 IO-APIC-edge
4: 0 2 IO-APIC-edge
6: 0 2 IO-APIC-edge floppy
7: 0 0 IO-APIC-edge parport0
8: 0 0 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
12: 0 4 IO-APIC-edge i8042
14: 0 906 IO-APIC-edge pata_sis
15: 0 0 IO-APIC-edge pata_sis
17: 0 12106 IO-APIC-fasteoi sata_sis
> Упс. Прошу прощения. Приложил.
Это что, /var/log/dmesg (или лог свежезагруженной машины)?
Sorry, я имел в виду то, что выводит /bin/dmesg после оопса или оопсов.
isolcpus=1 в default_smp_affinity само не переходит?
> Пока что воюю с IRQ affinity. Нарисовал скрипт-сервис:
P.S. А что будет, если
- maxcpus=1
- нагрузить вычислительно
- плюс одновременно нагрузить по I/O (оба харда)?
On Wed, Sep 07, 2011 at 05:58:15AM +0400, Anton Kovalenko wrote:Так он ядро отключит и энергопотребление резко упадет.
>
> P.S. А что будет, если
> - maxcpus=1
> - нагрузить вычислительно
> - плюс одновременно нагрузить по I/O (оба харда)?
>
> Если это по ведомству питания и напряжения, в результате должно
> довольно быстро упасть -- будем знать, что maxcpus помогает не
> "железно", и вообще копаться с программной стороны смысла нет.
Лучше что-нибудь солидное в USB подключить.
Вы правы [а я еще лет пять буду привыкать, что цпу столько жрут].
>> Если это по ведомству питания и напряжения, в результате должно
>> довольно быстро упасть -- будем знать, что maxcpus помогает не
>> "железно", и вообще копаться с программной стороны смысла нет.
>
> Так он ядро отключит и энергопотребление резко упадет.
2MR: irqpoll надо убирать, когда эксперимент направлен на «повалить», а
не на «вдруг пофиксили?»
> Проблема в том, что мне в единственном случае, когда нужно оба ядра -
> то есть mplayer - надо два треда одного приложения на разных ядрах :)
Насколько я могу понять, это разрешается. То есть
- при загрузке isolcpus=1 означает: «по умолчанию ядро #1 оставь в
покое».
- про mplayer через schedtool или cpuset можно сказать: «а вот эту бяку
запусти на двух ядрах» (affinity mask 3).
> Sorry, я имел в виду то, что выводит /bin/dmesg после оопса или оопсов.
Есть новый оопс. Ядро 3.0 без параметров (только ro).
Дублирую в рассылку. Да - система на этот раз зависла через примерно
три минуты после оопса.
[ 247.062434] BUG: unable to handle kernel paging request at fd0a1340
[ 247.062445] IP: [<c10b25e7>] unlink_anon_vmas+0x5d/0xe1
[ 247.062462] *pdpt = 000000000148b001 *pde = 0000000000000000
[ 247.062470] Oops: 0002 [#1] SMP
[ 247.062477] Modules linked in: ppdev lp cpufreq_conservative
cpufreq_userspace cpufreq_powersave cpufreq_stats speedstep_lib
acpi_cpufreq mperf autofs4 fuse it87 hwmon_vid loop saa7134_alsa
ir_lirc_codec lirc_dev snd_intel8x0 zl10036 snd_ac97_codec mt312
ir_sony_decoder ac97_bus ir_jvc_decoder snd_pcm_oss snd_mixer_oss
ir_rc6_decoder arc4 snd_pcm snd_seq_midi ir_rc5_decoder rt2800pci
saa7134_dvb rt2800lib snd_rawmidi snd_seq_midi_event snd_seq
parport_pc parport tpm_tis tpm tpm_bios ir_nec_decoder videobuf_dvb
dvb_core crc_ccitt rt2x00pci rt2x00lib snd_timer snd_seq_device
mac80211 saa7134 cfg80211 rc_core rfkill snd eeprom_93cx6
videobuf_dma_sg videobuf_core v4l2_common soundcore videodev
snd_page_alloc media shpchp tveeprom pci_hotplug button processor
i2c_core evdev psmouse pcspkr serio_raw ext3 jbd mbcache sg sd_mod
crc_t10dif sr_mod cdrom usbhid ata_generic hid sata_sis ohci_hcd
pata_sis ehci_hcd libata usbcore scsi_mod fan sis900 mii floppy
thermal thermal_sys [last unloaded: scsi_wait_scan]
[ 247.062599]
[ 247.062604] Pid: 3028, comm: automount Not tainted 3.0.0-1-686-pae
#1 /661 7MJ
[ 247.062613] EIP: 0060:[<c10b25e7>] EFLAGS: 00010206 CPU: 1
[ 247.062618] EIP is at unlink_anon_vmas+0x5d/0xe1
[ 247.062622] EAX: fd0a1340 EBX: f5740fc8 ECX: f52ac284 EDX: f7227a90
[ 247.062626] ESI: f551a6e4 EDI: f5480900 EBP: f52ac22c ESP: f513bea4
[ 247.062630] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[ 247.062635] Process automount (pid: 3028, ti=f513a000 task=f72cbae0
task.ti=f513a000)
[ 247.062638] Stack:
[ 247.062640] f7227a88 f52ac268 f52ac22c 00000000 f52ac22c b76c9000
c10a9b05 f513beec
[ 247.062653] f52a38b4 f52ac334 f72bdc80 f513beec bfc8e000 c10af203
00000000 ffffffff
[ 247.062664] f513bf28 00000000 f72bdc80 80000001 00000001 f51d4000
f51d4000 00000008
[ 247.062676] Call Trace:
[ 247.062685] [<c10a9b05>] ? free_pgtables+0x47/0x92
[ 247.062690] [<c10af203>] ? exit_mmap+0x92/0xbd
[ 247.062699] [<c1034464>] ? mmput+0x4e/0xbf
[ 247.062704] [<c1038e45>] ? exit_mm+0x107/0x10f
[ 247.062712] [<c12ada94>] ? _raw_spin_lock_irq+0xb/0x16
[ 247.062717] [<c103905d>] ? do_exit+0x210/0x633
[ 247.062724] [<c10cb04e>] ? fput+0x149/0x161
[ 247.062729] [<c1039675>] ? do_group_exit+0x5c/0x7f
[ 247.062734] [<c10396a9>] ? sys_exit_group+0x11/0x14
[ 247.062740] [<c12b245f>] ? sysenter_do_call+0x12/0x28
[ 247.062744] Code: 53 10 89 c7 8b 43 14 89 42 04 89 10 8d 46 1c c7
43 10 00 01 10 00 c7 43 14 00 02 20 00 39 46 1c 74 20 8b 43 0c 8b 53
08 89 42 04
[ 247.062784] 10 89 d8 c7 43 08 00 01 10 00 c7 43 0c 00 02 20 00 e8 a6 f0
[ 247.062804] EIP: [<c10b25e7>] unlink_anon_vmas+0x5d/0xe1 SS:ESP 0068:f513bea4
[ 247.062812] CR2: 00000000fd0a1340
[ 247.062817] ---[ end trace d8f2b2e47293463f ]---
[ 247.062821] Fixing recursive fault but reboot is needed!
--
Yours, Mikhail Ramendik
Unless explicitly stated, all opinions in my mail are my own and do
not reflect the views of any organization
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/CANq10gs+7LFo13wvE9VR9VE1...@mail.gmail.com
> Эксперимент на тему <<пофиксить>> (соответственно, на него нужно много
> времени, зато в это время можно пользоваться машиной):
>
> Попробуйте автомонтирование отключить (autofs? autofs5?)
> и запретить поллинг устройств udisks (для этого надо пустить udisks
> --inhibit-all-polling в начале работы, и /не срубать/ его по Ctrl-C --
> пусть так и выполняется).
Поллинг udisks уже отключён, аж через udev.
autofs используется на монтирование DVD... в этом месте звучит "ёшкин
кот" и странные подозрения. Я подумаю на тему "пофиксить через так" -
просто тогда DVD в системе не будет. (Или есть какая-то вменяемая
автоматическая возможность без autofs и с _фиксированной_, а не как в
гноме, точкой монтирования?)
> Кроме того, в ядре 3.0-rc/pre и 2.6.39 точно трогали locking как раз в
> том месте, в котором у нас 2/3 оопсов;
Один оопс был на 2.6.32, два других (включая последний присланный) на
3.0, так что кажется не изменилось.
P.S. Про прерывания, идущие на CPU 1, я уже написал в LKML. Про
isolcpus (и запус к mplayer на два процессора) подожду - "в тех
кругах" есть мнение что лучше использовать не isolcpus, а cgroups, а в
них мне пока не удалось разобраться.
DVD отключил. Не только autofs убрал, и не только сервис autofs
отключил,, но и физически PATA кабель выдернул (питание оставил). Все
опции ядра кроме ro убрал, ядро оставил штатное 2.6.32.
Дальше запустил:
- Две компиляции ядра (простое make в цикле) - на двух разных HDD
- После 45 минут нормального полёта добавил 2x hdparm -t (два разных
hdd) в цикле
- После ещё 30 минут добавил два ubench в цикле
И ещё где-то полтора часа всё это пролетало без явных проблем, потом
компьютер понадобился. Таким образом, доказать что виновато питание не
удалось. (USB пылесоса, к сожалению, нет.)
Будем смотреть. Если без DVD всё работает как часы - попробую вернуть
DVD без automount. Ушёл отсюда
...потом была перезагрузка, а через 3-4 часа зависло - без всякой
особой нагрузки, просто почту читали в Thunderbird.
Кажется, нагрузка тут вовсе ни при чём, так что и питание вряд ли при чём.
Вернул isolcpus=1. Ест ли хоть какой-то способ заставить mplayer
давать два треда на разные CPU? Ну в конце концов в исходники лезть
что ли, thread affinity ставить?
>> Вернул isolcpus=1. Ест ли хоть какой-то способ заставить mplayer
>> давать два треда на разные CPU? Ну в конце концов в исходники лезть
>> что ли, thread affinity ставить?
>
> affinity ставят на процесс, schedtool'ом:
>
> schedtool -a 0xffffffff -e mplayer
Не помогло - работает только на CPU 0. (-lavdopts threads=2 разумеется
используется).
schedtool -a 0x2 mplayer - странные показания top - судя по всему
работает только на CPU 1, причём Xorg там же.
Попробовал schedtool -a 1,2 mplayer - тут mplayer pабрал весь CPU 1,
оставив XOrg на CPU 0.
А требуется mplayer на оба - один тред на одном, другой на другом.
Иначе не хватает.
>> А требуется mplayer на оба - один тред на одном, другой на другом.
>> Иначе не хватает.
>
> Вы уверены, что он это вообще умеет? То есть ситуация, когда всё было в
> порядке и он успевал -- наблюдалась, и там было два треда на разных CPU?
Да, без isolcpus это именно так и работает.
> btw, у вас (если вывод на нвидию) -vo vdpau указано? (если вдруг нет --
> тогда укажите).
vdpau отсутствует. GeForce 6200.
>>> А требуется mplayer на оба - один тред на одном, другой на другом.
>>> Иначе не хватает.
>>
>> Вы уверены, что он это вообще умеет? То есть ситуация, когда всё было в
>> порядке и он успевал -- наблюдалась, и там было два треда на разных CPU?
>
> Да, без isolcpus это именно так и работает.
А я нашёл инструменты, которые вроде бы делают то что надо.
Смысл в том, что нужно не делать isolcpus, а создать cpuset (это
всё-таки проще в употреблении, и в дебиановском ядре есть). И каким-то
образом запихнуть все процессы начиная с init в этот cpuset. Ну а
потом отправить mplayer в root cpuset.
man от идеального инструмента лежит вот тут:
К сожалению, это часть коммерческого SGI ProPack. А жаль.
Как я понял, тут несколько строк на Си, да только для этих нескольких
строк надо очень много. Например, как собрать результат так, чтобы он
действительно мог исполняться в качестве init, и какие системные
вызовы (ядерные?) можно при этом использовать. А также как получить
PID от init и успеть его запихнуть в /dev/cpuset/system_cpuset/tasks
_до_ того, как init спаунит другие процессы...
Заметно хуже, потому что не с самого начала, это похоже умеет вот
такая тулза http://code.google.com/p/cpuset/ .
В общем теперь буду действовать так:
- Подожду пару дней - действительно ли isolcpus=1 помогает от зависаний
- Если помогает, попробую гуглевскую утилиту
- Если утилита не решает вопрос - придётся пытаться реализовать bootcpuset.
PID init'а равен 1.
--
Пришел в гости математик, почитать новую рукопись. Вычитал из нее трех
героев напрочь, и ушел.
Gimli on #arda
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/87vct2nttv.wl%r...@ran.pp.ru
Смысл в том, что эта штука должна запускаться _вместо_ init (с PID 1),
создавать cpuset и запихивать в него настоящий init. Но я уже понял,
что ей достаточно сначала запихнуть в этот cpuset себя, а потом -
вызывать init. Для запмуска самой штуки используется параметр ядра
init=...
Но я категорически не представляю себе, что можно, а что нельзя
делать, будучи на месте init. Главный вопрос - у меня есть libc6 или у
меня её нет? Если есть - то эта штука собирается более-менее обычно и
работает более-менее обычно.
> Я вообще на своих X-терминалах shell-овский скрипт в качестве init
> использую. Прекрасно работаает.
Хочу подробностей. ОЧЕНЬ хочу.
На шелле то, что я хочу, пишется без проблем. Вот оно:
#!/bin/sh
/bin/mkdir /dev/cpuset
/bin/mount -t cpuset - /dev/cpuset
/bin/mkdir /dev/cpuset/syscpuset
/bin/echo 0 >/dev/cpuset/syscpuset/cpus
/bin/echo $$ >/dev/cpuset/syscpuset/tasks
/sbin/init
Специально указал полные пути, исходя из того, что у нас ещё нет $HOME
и поэтому шелл не инициализируется вообще никак.
Но. Как в параметре ядра init указать нечто с параметрами?
"init=/bin/sh /bin/cpuset-hack", что ли?
Запуск mplayer после этого я, если я правильно понял, сделаю просто...
#!/bin/sh
rxvt -e mplayer -lavdopts=2 ... &
sudo echo `pidof mplayer` > /dev/cpuset/tasks
(Ну, реально ради безопасности вторая строка будет запуском отдельного
скрипта, чтобы именно его прописать в SUDOERS, но это уже не к той
теме).
> 2011/9/9 Victor Wagner <vi...@wagner.pp.ru>:
>
> > Я вообще на своих X-терминалах shell-овский скрипт в качестве init
> > использую. Прекрасно работаает.
>
> Хочу подробностей. ОЧЕНЬ хочу.
Нет никаких подробностей. Просто работает.
> На шелле то, что я хочу, пишется без проблем. Вот оно:
>
> #!/bin/sh
> /bin/mkdir /dev/cpuset
> /bin/mount -t cpuset - /dev/cpuset
> /bin/mkdir /dev/cpuset/syscpuset
> /bin/echo 0 >/dev/cpuset/syscpuset/cpus
> /bin/echo $$ >/dev/cpuset/syscpuset/tasks
> /sbin/init
Последняя строчка должна быть exec /sbin/init
Чтобы процесс не форкался, а замещал шелл инитом.
> Специально указал полные пути, исходя из того, что у нас ещё нет $HOME
> и поэтому шелл не инициализируется вообще никак.
Оно от рута работает. А /root у нас уже есть. И /etc уже есть.
А вообще можно в начале скрипта написать PATH=/bin:/sbin
Далее, /bin/echo ты используешь зря. В большинстве шеллов есть
встроенная команда echo.
> Но. Как в параметре ядра init указать нечто с параметрами?
> "init=/bin/sh /bin/cpuset-hack", что ли?
Да не нужно тебе /bin/sh. Просто объяви cpuset-hack исполняемым.
#!/bin/sh
отрабатывается ядром, и оно вполне справится с поиском интерпретатора и
в данном случае.
И лучше все-таки эту штуку держать не в /bin, а в /sbin
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110909125...@wagner.pp.ru
>> На шелле то, что я хочу, пишется без проблем. Вот оно:
> Последняя строчка должна быть exec /sbin/init
> Чтобы процесс не форкался, а замещал шелл инитом.
Ага. И ещё потребовалось echo 0 >/dev/cpuset/syscpuset/mems . После
этого оно заработало. Но куча задач осталась неперекинутой, поскольку
запускаются помимо init (включая kswapd0, в котором у меня oops'ы
были).
Я обнаружил, что лишнее перекинуть просто нельзя - на некоторые задачи
echo $pid >/dev/cpuset/syscpuset/tasks даёт write error. Но поскольку
перекидывать надо по одной строке, я не смог сделать это на шелле.
Сейчас у меня работает такое решение:
в ядре init=/sbin/cpuset-hack
файл /sbin/cpuset-hack , permissions 744 чтобы случайно не запустить:
#!/bin/sh
/bin/mkdir /dev/cpuset
/bin/mount -t cpuset - /dev/cpuset
/bin/mkdir /dev/cpuset/syscpuset
echo 0 >/dev/cpuset/syscpuset/cpus
echo 0 >/dev/cpuset/syscpuset/mems
echo $$ >/dev/cpuset/syscpuset/tasks
/sbin/cpuset-hack-python.py
exec /sbin/init
файл /sbin/cpuset-hack-python.py , permissions 744 по той же причине:
#!/usr/bin/python
f=open("/dev/cpuset/tasks")
tasks=f.readlines()
f.close()
for task in tasks:
try:
f=open("/dev/cpuset/syscpuset/tasks","w")
f.write(task)
f.close()
except IOError:
pass
Я конечно вижу, что это грязно, в общем случае на /usr нельзя
рассчитывать и надо на Си писать, но влом. Или этот же эффект как-то
достигается на shell+busybox?
И запуск mplayer нашёлся способ сделать (чуть хитрее чем я тут писал -
сначала отдать PID шелла в /dev/cpuset/tasks через sudo-скрипт, а
потом запустить из этого шелла mplayer).
А теперь вопрос - как бы мне выяснить, что это у меня за 20 задач,
которые не переносятся? Проверил у нескольких /proc/$pid/cmdline -
пусто. Но там и у kswapd0 пусто, а top как-то знает, что это именно
он. Как мне-то узнать? Гугль не помог :( Особенно это будет важно,
если выяснится что весь этот хак не работает, а isolcpus работает.
И ещё вопрос - а как мне в dmesg вякнуть? А то в лог не попишешь,
подмонтирован только корень и тот read only.
>> А теперь вопрос - как бы мне выяснить, что это у меня за 20 задач,
>> которые не переносятся? Проверил у нескольких /proc/$pid/cmdline -
>> пусто. Но там и у kswapd0 пусто, а top как-то знает, что это именно
>> он. Как мне-то узнать? Гугль не помог :( Особенно это будет важно,
>> если выяснится что весь этот хак не работает, а isolcpus работает.
>
> Это процессы в контексте ядра. Типично у них используемая память равна 0
И узнать, какой процесс как называется, никак нельзя? А то kswapd0
вроде тоже в контексте ядра должен быть, а top знает как его зовут.
>>
>> И ещё вопрос - а как мне в dmesg вякнуть? А то в лог не попишешь,
>> подмонтирован только корень и тот read only.
>
> hello.c:
>
> #include <linux/module.h>
> #include <linux/kernel.h>
Стоп, это модуль для ядра? А то у меня-то userland процесс, пусть и
"вместо init". Не хочу в ядерный контекст, без него страшно. Но
оставить след хоть в каких-то логах (не dmesg так ещё что-нибудь)
хотелось бы.
То есть, конечно, в скобках все те у которых нет args...
Это могут и процессы запущенные через pipe быть, например
>> И узнать, какой процесс как называется, никак нельзя? А то kswapd0
>> вроде тоже в контексте ядра должен быть, а top знает как его зовут.
>
> ps aux -- те, что в квадратных скобках
Нагуглил другой способ - спасибо за ключевые слова, без них не нагуглилось.
cat /proc/$pid/status | grep name
> Пока syslog не запущен то printk только так. А потом можно logger
У меня "вместо init", значит printk. Значит Си. Я пока пытаюсь Сей
избежать, так что обойдусь :) Хотя если где-нибудь есть исходник, из
коего можно сделать /bin/printk...
При помощи простенького питонного скрипта с os.system() я узнал, какие
же процессы у меня остались не в новом cpuset:
Name: migration/0
Name: ksoftirqd/0
Name: watchdog/0
Name: migration/1
Name: ksoftirqd/1
Name: watchdog/1
Name: events/0
Name: events/1
Name: kintegrityd/0
Name: kintegrityd/1
Name: kblockd/0
Name: kblockd/1
Name: kondemand/0
Name: kondemand/1
Name: aio/0
Name: aio/1
Name: crypto/0
Name: crypto/1
Name: ata/0
Name: ata/1
Для сравнения:
$ cat /proc/31/status | grep Name
Name: kswapd0
Таким образом, /0 или /1 это такие CPU affinity. Это подтверждается
просмотром полного /proc/$pid/status - там есть пункт
Cpus_allowed_list и в нём для данных процессов указан 0 или 1.
Более того. Точно такие же процессы имеются при isolcpus=1 - и для CPU
1 тоже. Значит, мне удалось полностью реплицировать isolcpus на
cpusets.
Прикол в том, что на эту тему нагуглился разговор в LKML, там isolcpus
хотели отменить, но нашлись юзеры, его применяющие. Вот переписать моё
решение на Сях, уонфиг ему сделать - и закинуть в LKML как
уж-совсем-полный аналог isolcpus?
Ладно, это потом, сначала узнаем, пропадут ли зависы. Пока погонял
сколько-то с no_hz=off - не зависло, а обычно с ним висло быстро...
(И кстати, если пропадут - стоит ли пытаться искать баг, возвращая
задачи на оба процессора? Или заработало - и ладно? Или можно так:
заработало - и ладно, но написать в ЖЖ на английском и русском
решение, чтобы следующие напоровшиеся смогли его найти?)
Кстати, всем огромное спасибо - я бы не добрался до столь странного
решения без КУЧИ подсказок.
>> Прикол в том, что на эту тему нагуглился разговор в LKML, там isolcpus
>> хотели отменить, но нашлись юзеры, его применяющие. Вот переписать моё
>> решение на Сях, уонфиг ему сделать - и закинуть в LKML как
>> уж-совсем-полный аналог isolcpus?
>
> Но все-таки. А почему нельзя поменять affinity у одной из нитей mplayer??
Нет такой опции в командной строке. Это в исходник лезть. А там
непростой исходник. К тому же он регулярно обновляется и я не хотел бы
устраивать личный форк.
(А сделать настоящий патч, с новой опцией и её разбором, я пожалуй что
не потяну).
Установка affinity на два СPU для процесса mplayer - не помогает. Либо
на один, либо на другой, но не на оба. Вот такая неприятная штука
isolcpus.
Я гуглил, у людей была похожая задача. Примерно так: isolcpus 1-3,
надо было сделать процесс load balanced между CPU 2 и CPU 3. Ответ был
- не используйте isolcpus, используйте cpuset.
Однако, это уже решили. При использовании cpuset проблемы просто нет.
Ну, sudo требуется, но это дело штатное. (Хотя более корректно было бы
играть с правами доступа на файл tasks, но какая уж тут корректность
если я на /usr/bin/python рассчитываю при запуске init).
Можно, но так как получилось - явно проще. (А что грязно - так
переписать с shell+python на pure C будет быстреею чем библиотеку
сочинять).
Кажется, можно совсем красиво сделать. Но нужна подсказка по деталям.
А именно - через некоторое время после логина (производимого при
помощи kdm) юзерский процесс сразу отправить в /dev/cpuset/tasks,
чтобы всем юзерским задачам дать два процессора.
При этом, сам X сервер должен остаться где был, на одном процессоре.
Но я посмотрел в top - он от рута работает.
Вопрос в том, куда это поставить. Чьими детьми будут все процессы,
запускаемые самим юзером (именно при логине через kdm, консоль/ssh не
рассматриваем)? И в какой скрипт это, соответственно, вставить?
Сам вроде бы догадываюсь до Xsession (положить скрипт в
/etc/X11/Xsesson.d - они вроде бы выполняются не exec, а source, и
потому в $$ там толжен быть pid как раз сессии). Но - сработает ли? И
точно ли это выполняется уже от юзера и не имеет отношения к запуску
самого сервера? Я попросту не понял этого из манов.
Кроме того, гугль вроде бы подсказывает, что поскольку используется
kdm - править придётся /etc/kde4/kdm/Xsession. Или всё-таки
/etc/X11/Xsession.d сработает?
А то получается шанс "прозрачно" решить проблему. Хотя и не факт, что
получится, но уж больно приятный выходит вариант. Вообще без потери
удобства и производительности - просто загнали всю систему на CPU0.
> Ну и то, что ты делаешь на python тоже прекрасно делается на shell.
>
> Есть в нем и read и for, и while
Мне нужно следующее:
- Считать содержимое /dev/cpuset/tasks в массив, по строчкам. И больше
этот файл не трогать совсем. Массив должен быть в памяит (больше
негде, файлова система read only)
- Каждой строке массива отдельно сделать echo $string
>/dev/cpuset/syscpuset/tasks . Ошибки игнорировать.
Я не смог нагуглить, как сделать это шеллом. Поэтому и сделал питоном.
Если шеллом можно сделать _это_, может им можно и конфиг разобрать? В
этом случае даже production решение (для публикации) можно делать на
шелле. Особенно если независимо от того сделать /sbin/kprint для
выкидывания чего-нибудь в dmesg.
Так мой процесс, маленький совсем, запускается _до_ монтирования чего-либо RW.
Я пока без логгинга обойдусь, но неприятно.
Ага, но там придётся алгоритм для load balancing придумывать. Этот
тред туда, а этот сюда. А зачем, когда оно в ядре уже есть? Ты же сам
против того чтобы делать работу, которая уже сделана.
Решение через cpuset позволяет обойтись _тривиальным_ кодом. То есть,
если бы не моя отсталость от нынешнего C, то проблем бы не было вовсе,
а так - ну, грязновато вышло, но для проверки сойдёт. Может ведь и не
помочь.
for task in `cat /dev/cpuset/tasks`
do
echo $task > /dev/cpuset/syscpuset/tasks
done
Правда, я не смог посмотреть, что там пишется - у меня такого файла нет. Если
в /dev/cpuset/tasks больше одного слова на задачу, то надо более тщательно
строить цикл.
> А теперь вопрос - как бы мне выяснить, что это у меня за 20 задач,
> которые не переносятся? Проверил у нескольких /proc/$pid/cmdline -
> пусто. Но там и у kswapd0 пусто, а top как-то знает, что это именно
> он. Как мне-то узнать?
/proc/$PID/stat
> Гугль не помог :( Особенно это будет важно,
> если выяснится что весь этот хак не работает, а isolcpus работает.
Скорее всего, треды ядра. К которым, собственно, относится и kswapd.
--
Если ты не боишься синего экрана, то почему боишься черного?
-- Д.Белявский
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/87ty8lng8l.wl%r...@ran.pp.ru
> Не слушай ты темных и необразованных людей. Я тоже, когда был молодой и
> глупый, пытался ядро патчить для решения задач, к которым существуют
> userspace решения.
Вот сейчас я хочу найти, надеюсь, пока что последнее решение для тго
конкретного набора (дальше - тестирование).
А именно - как мне произвести нужную операцию для процесса, который
породит все _юзерские_ процессы после логина. Но не рутовые, например
не X сервер.
В Xsession что ли, и если да - какой у дебиановского kdm Xsession?
Я хочу попробовать дать этому процессу оба процессора ( грубо говоря,
sudo echo $$ >/dev/cpuset/tasks - реально это будет вызываемый по sudo
скрипт с pid в качестве $1). Оставив при этом все системные/рутовые
процессы на одном СPU 0.
Если систему завешивает какой-то конкретный кривой процесс, а не
scheduler, то этого должно быть достаточно для борьбы с зависанием.
Более того, если CPU 1 битое аппаратно - насколько я понимаю тоже,
поскольку нерутовое приложение систему не вешает, а из проблем умеет
либо процессор загружать, либо падать.
(А что касается mplayer - так ему я ещё и nice -2 хочу дать, если с
безопасностью справлюсь. Чтобы он успешно играл фильмы, требующие
всего процессора, когда загружен iceweasel и отжирает процентов 40-50
одного ядра).
> 2011/9/10 Victor Wagner <vi...@wagner.pp.ru>:
>
> > О©╫О©╫ О©╫ О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ python О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ shell.
> >
> > О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫ read О©╫ for, О©╫ while
>
> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
>
> - О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ /dev/cpuset/tasks О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ read only)
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫? О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ /dev/cpu/tasks О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
LIST=`cat /dev/cpuset/tasks`
for pid in $LIST; do
echo $pid > /dev/cpyset/syscpuset/tasks
done
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ shell.
О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫ /dev/cpuset/tasks О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫)
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ AS IS
LIST="`cat /dev/cpuset/tasks`"
О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
echo "$LIST" | while read line; do
echo $line >/dev/cpuset/syscpyset/tasks
done
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $LIST О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ echo.
> - О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ echo $string
> >/dev/cpuset/syscpuset/tasks . О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
>
> О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫,
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫".
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
/bin/sh О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ (О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫), О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ /bin/sh О©╫О©╫О©╫
О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ _О©╫О©╫О©╫_, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫? О©╫
О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ source/require О©╫ О©╫.О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ namespace О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ vulnerability,
О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ production О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫) О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ /sbin/kprint О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ dmesg.
О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ /sbin/kprint О©╫
/dev/kprint - О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ character
devices, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ /sbin/kprint О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫
userspace О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ character device (О©╫ О©╫О©╫О©╫ -
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫), О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ echo О©╫О©╫О©╫О©╫О©╫О©╫.
>
> --
> Yours, Mikhail Ramendik
>
> Unless explicitly stated, all opinions in my mail are my own and do
> not reflect the views of any organization
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
> Поэтому вполне сработает такая конструкция
>
> LIST=`cat /dev/cpuset/tasks`
> for pid in $LIST; do
> echo $pid > /dev/cpyset/syscpuset/tasks
> done
Спасибо. Вот как раз того, что шелловский for умеет итерировать по
строке, разделяя newlines, я и не знал.
(Это подойдёт - там просто числа, разделённые newline).
>> Если шеллом можно сделать _это_, может им можно и конфиг разобрать? В
>
> Да, естественно.
>
> Я очень часто делаю конфиги скриптами на том же языке, что и основной
> продукт, и промом просто делаю им source/require и т.д.
Всё что тут надо конфигурировать, по максимуму:
CPUSETNAME=name
CPUS=cpus
MEMS=mems
MOVE_KERNEL_PROCESSES=[true|false]
В первой версии хватит CPUS и MEMS (имя "прибить гвоздиком", имеющиеся
процессы всегда перегонять). Для 80-90% случаев этого IMHO достаточно.
Ну, вообще это _можно_ сделать исполняемым. И вроде бы при ошибке,
если новых строк не добавлять, оно как максимум не сработает, но
система загрузится. Потому что если cpus/mems невалидно, система
просто не позволяет записать задачи в новый cpuset.
> Как мне кажется, куда более прямым решением будет не /sbin/kprint а
> /dev/kprint - маленький такой ядерный модуль, предоставляющий character
> devices, и передающий все, что туда пишется, в буфер сообщений ядра.
Я просто не верю, что готовое решение для логгинга userland процессов
до RW монтирования /var/log отсутствует. Ну сам-то /sbin/init должен
куда-то сообщить об ошибке в /etc/inittab .
> Дело в том, что для /sbin/kprint тебе все равно понадобится какой-то
> интерфейс с ядром - просто так внутреннюю ядерную функцию ты из
> userspace не позовешь.
Вот это и вопрос - позовёшь или нет. Если нет, то для работы решения
требуется собрать ядерный модуль. Значит, чтобы оно работало нормально
при штатном обновлении ядра (подъём версии - тоже штука штатная), мне
ещё и dkms прикручивать придётся. Как-то оно явно того не стоит. Уж
проще этот скрипт выпустить без лога.
(А создавать больше одного cpuset ему не нужно в принципе. Куда более
продвинутая система управления cpuset для sysv init уже есть. А этот
скрипт - для параноидального выгоняния всей системной шушеры _сразу_,
чтобы даже sysv init не дожидаться).
> 2011/9/10 Victor Wagner <vi...@wagner.pp.ru>:
>
> > Не слушай ты темных и необразованных людей. Я тоже, когда был молодой и
> > глупый, пытался ядро патчить для решения задач, к которым существуют
> > userspace решения.
>
> Вот сейчас я хочу найти, надеюсь, пока что последнее решение для тго
> конкретного набора (дальше - тестирование).
>
> А именно - как мне произвести нужную операцию для процесса, который
> породит все _юзерские_ процессы после логина. Но не рутовые, например
> не X сервер.
>
> В Xsession что ли, и если да - какой у дебиановского kdm Xsession?
Насколько я понимаю, у всех дебиановских dm используется одна и та же
система скриптов в /etc/X11/Xsession.d
Там достаточно развесисто - оно умеет запускать как минимум dbus-session и
ssh-agent
так, чтобы window manager был их потомком.
> Я хочу попробовать дать этому процессу оба процессора ( грубо говоря,
> sudo echo $$ >/dev/cpuset/tasks - реально это будет вызываемый по sudo
> скрипт с pid в качестве $1). Оставив при этом все системные/рутовые
> процессы на одном СPU 0.
Есть такая добрая идиома чтобы echo-м писать от рута:
echo something | sudo tee somefile
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
> Есть такая добрая идиома чтобы echo-м писать от рута:
>
> echo something | sudo tee somefile
У меня ещё и renice в комплекте, и я что-то не очень понимаю как
сделать это безопасно.
В принципе хотелось бы вот такой скрипт, разрешённый в sudoers (у меня
так уже живёт монтирование флешки, это IMHO всё же безопаснее чем
setuid):
#!/bin/sh
echo $1 >/dev/cpuset/tasks
renice -4 -p $1
Но тут невооружённым глазом видна дырка на injection.
Можно ли чем-то её закрыть, не считая варианта "написать то же самое
на питоне"? Там-то проверить тривиально - int(sys.argv[1]), и если не
конвертится - то exception.
echo something | sudo tee somefile >/dev/null
--
Intel - тоже Сильмарилл. Только сделанный не так...
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/87sjo4olnj.wl%r...@ran.pp.ru
>> > if printf "%s" "$1" | grep '^[1-9][0-9]*$' >/dev/null 2>&1
>> > then :
>> > else exit 1
>> > fi
>>
>> Спасибо! К сожалению, расшифовать это мне не удалось. Каким образом
>> оно упадёт, если в $1 _не только_ цифры?
>
> Если там не только цифры (причем начинающиеся не с 0) или даже пустая строка,
> то регулярное выражение не удовлетворится, и grep завершится с кодом 1. А
> поскольку он последний, то это будет код завершения всего pipeline, что после
> if. Отсюда - ветка else, где exit 1.
>
> Или тебе чего расшифровать? Регулярное выражение?
Оно понятно что это не здесь...
Ну не понимаю я регулярные выражения :( Впрочем, я вообще предпочитаю
_читаемые_ языки. Из программистов в техписатели ушёл, когда C++ всех
победил (Python тогда ещё не было, а Дельфи уже уходили).
Однако спасибо - в данном случае просто заюзаем :)
> А вообще для программирования на шелле существует довольно надежный способ
> ломаться - надо включить опцию -e, например, сказав не
>
> #!/bin/sh
>
> а
>
> #!/bin/sh -e
>
> Тогда любая команда, завершившаяся неудачно (кроме команд, стоящих в условии
> if или перед ||) будет приводить к тому, что в этом месте скрипт и завершится.
Это да, но когда то, что требует в Питоне int(), в шелле требует
regexp, а иначе даже не упадёт нормально, мне становится непросто :)
> Intel - тоже Сильмарилл. Только сделанный не так...
Представил себе двухядерный Сильмарилл.
> 2011/9/10 Artem Chuprina <r...@ran.pp.ru>:
>
> >> > if printf "%s" "$1" | grep '^[1-9][0-9]*$' >/dev/null 2>&1
> >> > then :
> >> > else exit 1
>
> О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ :( О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> _О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫_ О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫шёО©╫, О©╫О©╫О©╫О©╫О©╫ C++ О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (Python О©╫О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
[skip]
> О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ int(), О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> regexp, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ :)
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
if printf %d "$1"
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ %d О©╫О©╫ printf
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
expr "$1" + 0
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
>> В принципе хотелось бы вот такой скрипт, разрешённый в sudoers (у
>> меня так уже живёт монтирование флешки, это IMHO всё же безопаснее
>> чем setuid):
>> #!/bin/sh
>> echo $1 >/dev/cpuset/tasks
>> renice -4 -p $1
>> Но тут невооружённым глазом видна дырка на injection.
>> Можно ли чем-то её закрыть, не считая варианта "написать то же самое
>> на питоне"? Там-то проверить тривиально - int(sys.argv[1]), и если
>> не конвертится - то exception.
> Можно даже на чистом sh, но проще всего -
> if printf "%s" "$1" | grep '^[1-9][0-9]*$' >/dev/null 2>&1
> then :
> else exit 1
> fi
> grep у тебя будет, он в бизибоксе есть. printf - встроенная команда
> шелла. Опять же, включая бизибокс.
Можно использовать -q вместо > /dev/null, благо grep из BusyBox
ее умеет:
$ busybox grep --help 2>&1 | grep -F -- -q
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
$
Кроме того, я бы добавил \n к строке формата printf.
Еще можно воспользоваться expr, который также имеется в BusyBox.
E. g.:
if test 1 = "$(expr length quote "$1" \
= quote "$1" : '[1-9][0-9]*')" ; then
--
FSF associate member #7257 Coming soon: Software Freedom Day
http://mail.sf-day.org/lists/listinfo/ planning-ru (ru), sfd-discuss (en)
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/86wrdg3...@gray.siamics.net
Я просто подумал, что флуд вышел какой-то уж очень знатный. С другой
стороно, он весь в топик, что для флудов редкость.
(Между тем, есть шанс что всё это реально сработало - тестирование
_пока что_ проблем не показало. Несмотря на "провокацию" - я включил
no_hz=off, с коим раньше висло заметно быстрее. Но окончательные
выводы делать пока рано, как и задавать вопрос "что же это всё-таки за
неведомая штука").
>И вообще, регулярные выражения - это читаемый
> язык. Только почти не избыточный.
Ну, в теории и perl читаемый ;)
> [0-9] - то же самое, но от 0 до 9. Т.е. любая цифра.
>
> * - предыдущее подвыражение должно матчиться любое количество раз, в том числе
> нулевое.
Ах вот где тут хитрость. Я про "в том числе нулевое".
Будем пробовать.
>> > Intel - тоже Сильмарилл. Только сделанный не так...
>>
>> Представил себе двухядерный Сильмарилл.
>
> Судя по продолжительности свечения, ядер в Сильмарилле существенно больше двух
> :-)
А, в этом смысле. Ну, отсюда можно сделать много интересных выводов,
но не будем портить сложившийся _топичный_ тред :) Я-то про всё тот же
мой двухядерный Intel Pentium D, который сделан и впрасду как-то не
так (а может, это чипсет SiS 661FX не так сделан... или ещё вариант -
процессор до меня разгоняли и много перегревали. Я его и сам чуток
перегревал несколько дней, но не смертельно - просто BIOS был кривой и
недокручивал вентилятор, частота оставалась штатной. Потом я прибил
скорость вентилятора на максимум).
IMHO граница между читаемыми и нечитаемыми языками лежит
между brainfuck и whitespace ;-}
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110910222...@nano.ioffe.rssi.ru
А если по-другому, apt-get install confget и читать ман на тему -S :)
Всего лучшего,
Петр
--
Peter Pentchev ro...@ringlet.net ro...@FreeBSD.org pe...@packetscale.com
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
If I were you, who would be reading this sentence?
всё-таки имеет смысл прочитать хотя бы про основы:
http://ru.wikibooks.org/wiki/Регулярные_выражения
там присутствуют и более углублённые источники, из которых могу
порекомендовать книгу Фридла·
а в процессе познания и «пробы» сами собой нарисуются, но, естественно,
будут более осмысленными, нежели примитивный «научный тык»·
--
wbr, alexander barakin aka sash-kan.
--
To UNSUBSCRIBE, email to debian-russ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/20110912093...@teta.mezon.local
Давно уже выяснилочь, что на этой системе даннео действие приводит к
завису, и что причина в том, что все APIC прерывания почему-то идут
исключительно на cpu1 вне зависимости от настроек affinity.