Samba 4 - zasek v neprerusitelnem cekani
Dan Lukes
dan at obluda.cz
Mon Sep 22 16:48:01 CEST 2014
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
More information about the Users-l
mailing list