On 09/22/14 15:50, Miroslav Prýmek:
na FreeBSD 10.0-RELEASE-p7 mam zasadni problem - jednou za cas (zhruba
za tyden) zustane proces smbd
(fileserver samby) trcet v "D" stavu:
# ps aux | grep smbd
[...]
[...uzivatel...] 35343 0.0 1.2 563924 99856 - D Fri05AM 1:20.98
/usr/local/sbin/smbd -D --option=server role check:inhibit
[...]
Prusvih je, ze ten uzivatel se pak nemuze na Windows prihlasit a proces
samozrejme nejde sestrelit,
jedine restartovat server, coz je desivej prusvih. Navic korunovanej
tim, ze se server odmitne restartovat
Pokud proces nelze zlikvidovat ani signalem 9 pak to znaci jedine -
proces je prave "v kernelu" - tedy zahajeny a jeste nedokonceny syscall.
A to, ze server nelze ani restartovat to jen potvrzuje, zpresnene o to,
ze zrejme jde o nejaky zamkovy dead-lock, mene pravdepodobne jiny
problem souvisejici se zamkovanim.
PID TID COMM TDNAME KSTACK
35343 100509 smbd - mi_switch sleepq_wait
_sx_slock_hard namei vn_open_cred zfs_getextattr VOP_GETEXTATTR_APV
extattr_get_vp sys_extattr_get_file amd64_syscall Xfast_syscall
35343 100738 smbd - mi_switch sleepq_wait
sleeplk __lockmgr_args vop_stdlock VOP_LOCK1_APV _vn_lock
knlist_remove_kq filt_vfsdetach knote_fdclose closefp amd64_syscall
Xfast_syscall
Tak nejak z toho teda matne tusim, ze oba thready procesu trci v nejakem
neprerusitelnem cekani (sleepq_wait), jeden se snazil ziskat atributy
souboru, druhy smazat nejake knotes. To mi ale nic nerika ani nepomuze...
Prvni se skutecne snazi ziskat extended atributy souboru, ten druhy
docela obycejne zavira file-descriptor. Jako projev cisteho hadani si
dovolim vyslovit domenku, ze oboji se tyka tehoz souboru nebo alespon
adresare.
Takze prosim jestli mate jakykoli rady, jak postupovat, poradte prosim,
je to desnej prusvih...
Problem je race-condition. Dve operace, ktere nastanou v nevhodne casove
koincidenci. Tedy problem, ktry bud enastavat nahodne, statisticky, a
patrne nebude spolehlive/snadno deterministicky vyvolatelny.
Coz zasadne komplikuje analyzu problemu i hledani reseni.
Potrebuju vedet hlavne:
1. jestli tuhle chybu muze nejak vyvolat samotnej proces (jako ze by to
byla chyba procesu, ne kernelu) - to predpokladam, ze ne.
Chyba je v kernelu, vyvolana je konkretnimi pozadavky aplikace, vcetne
jejich vzajemneho casoveho prubehu.
2. jak zjistit nejake dalsi informace o tom, co se deje? (muzu jeste
neco zkouset behem dneska, zitra rano uz ten server
musim restartovat, aby se uzivatele mohli prihlasit...)
V tehle chvili muzes vyvolat panic (halt -d) a ziskat dump (pokud mas
dostatecne velky swap a dump nakonfigurovany pomoci dumpon). Jenze
vyslednej dump je skoro k nicemu pokud nemas kernel prelozeny s
debugovacimi informacemi - a i pak je analyza tohohle typu problemu
extremne obtizna, protoze problem nevznika "v jednom miste", ale
konkretnim procesem pruchodu dvou soucasne bezicich vlaken kernelu.
Musim rict, ze me by se do toho vubec nechtelo, protoze pres znacnou
pracnost je uspech dost nejisty ...
Aby byla vubec sance, chtelo by to kernel prelozeny s
options INVARIANT_SUPPORT
options INVARIANTS
options WITNESS_SUPPORT
options WITNESS
makeoptions DEBUG=-g
viz
https://www.freebsd.org/doc/en/articles/geom-class/prelim.html
To ale znamena znacnou ztratu vykonu.
3. je nejaka alespon sebemensi sance, jak tehle situaci predejit? (vim,
ze informaci je malo, ale aspon neco zkusit...)
No, kdyby nedochazelo k te casove kolizi dvou procesu, zrejme by nedoslo
k pozoprovanemu problemu. Akorat me trochu utekl vyvoj v tehle oblasti a
tak vlastne nevim jestli jde paralernimu vstupu procesu do jadra
zabranit. Zrejem by k nemu nedochazelo, kdyby kernel nebyl MP. Ale
netusim jestli takhle desitku jest eprelozit lze. Taky by k tomu,
zrejme, nedoslo, kdyby se vsem syscallum odebral priznak MP_SAFE - pak
by k paralernimu vstupu do jadra taky nedochazelo.
Mozna by stacilo i jen zakazat vsechny procesorovy jadra az na BS. Al
eani u toho nevim jak se to udela, ani jestli by to skutecne
paralelismus zlikvidovalo.
A cenou by samozrejme byla ztrata vykonu.
4. je nejaka sance, jak t situaci resit? (asi nejspis zjistit, na co
proces ceka a nejak to nasilne ukoncit) - to je asi sci-fi, ale lina
huba...
Proces "v jadre" nelze zadnym zpusobem ukoncit. Takze jedine zabranit
soucasnemu vstupu, jak vyse zmineno.
Nebo zkusit takovou modifikaci systemu, ktera pozmeni nekterou ze
zucastnenych vetvi. Zavirani filedescriptoru se asi zbavit nepodari, ale
pokud se dokazes zbavit ZFS a pouzit UFS, tak dojde ke zmene v druhe
vetsi a je mozne, ze se tim problem vyresi.
A pak samozrejem navrat k te konfiguraci, kdy to to jeste naposled
fungovalo - to te ale urcite napadlo taky ...
Dan
--
FreeBSD mailing list ([email protected])
http://www.freebsd.cz/listserv/listinfo/users-l