HP server a problémy s real-time
Pavel Troller
patrol na sinus.cz
Čtvrtek Duben 14 11:10:49 CEST 2011
Zdravím,
> Jak mate nakonfigurovanou tu E1?
to není důležité. Jak píšu, k zadrhávání dochází, ikdyž karta vůbec není
nakonfigurovaná a aktivní. Naopak v DL360 máme 2 tyto karty naráz (16 E1)
a všech 16 E1 jede bez jediné chybičky a zadrhnutí.
Ale abych přesto odpověděl, celkem standardně - HDB3, CRC4, na šesti
E1 DSS1/PRI a na zbylých dvou SS7.
Zdraví Pavel
>
> JP
>
> Dne 14.4.2011 05:15, Pavel Troller napsal(a):
>> Zdravím,
>> mám tu zase jeden opravdu zapeklitý případ pro počítačové experty :-).
>> Zakoupili jsme na firmě tento server:
>> Manufacturer: HP
>> Product Name: ProLiant DL120 G6
>> Jde o 1U pizzabox, čtyřjádrový xeon @ 2.66 GHz, k tomu hyperthreading,
>> paměti pro danou aplikaci dostatek (4G).
>> Server má sloužit jako telefonní ústředna Asterisk, pro účel čehož je
>> v něm vložena karta 8xE1 Sangoma.
>> Problém je, že server trpí pravidelnými krátkodobými výpadky chodu, kdy
>> v určitých relativně přesných časových intervalech "mrzne" na dobu až
>> desítek milisekund a pak se zase rozbíhá. Lépe než slovní popis to vysvětlí
>> ukázka výpisu maličkého diagnostického prográmku:
>>
>> Extensive sleep: 2441 usecs.
>> Freeze interval: 2343820 usecs.
>> Extensive sleep: 1934 usecs.
>> Freeze interval: 2343454 usecs.
>> Extensive sleep: 2145 usecs.
>> Freeze interval: 2343205 usecs.
>> Extensive sleep: 1678 usecs.
>> Freeze interval: 2343493 usecs.
>> Extensive sleep: 777 usecs.
>> Freeze interval: 2342056 usecs.
>> Extensive sleep: 2370 usecs.
>> Freeze interval: 2345172 usecs.
>> Extensive sleep: 707 usecs.
>> Freeze interval: 2341719 usecs.
>> Extensive sleep: 2077 usecs.
>> Freeze interval: 2344949 usecs.
>> Extensive sleep: 1325 usecs.
>> Freeze interval: 2343499 usecs.
>> Extensive sleep: 2121 usecs.
>> Freeze interval: 2343508 usecs.
>> Extensive sleep: 1311 usecs.
>> Freeze interval: 2343476 usecs.
>> Extensive sleep: 2020 usecs.
>> Freeze interval: 2343395 usecs.
>> Extensive sleep: 1716 usecs.
>> Freeze interval: 2343839 usecs.
>> Extensive sleep: 2101 usecs.
>> Freeze interval: 2343219 usecs.
>> Extensive sleep: 1310 usecs.
>> Freeze interval: 2343460 usecs.
>> Extensive sleep: 2139 usecs.
>> Freeze interval: 2343560 usecs.
>> Extensive sleep: 1815 usecs.
>> Freeze interval: 2343826 usecs.
>> Extensive sleep: 2360 usecs.
>> Freeze interval: 2343387 usecs.
>>
>> Zdrojový text jest zde:
>>
>> # cat timetest.c
>>
>> #include<sys/time.h>
>> #include<sys/types.h>
>> #include<sched.h>
>> #include<stdio.h>
>>
>> void main () {
>> struct timeval tv1,tv2,tv3,tv4;
>> int diff, diff2, diff3;
>> struct sched_param sp;
>>
>> sp.__sched_priority=99;
>>
>> if (sched_setscheduler(0, SCHED_FIFO,&sp)) {
>> perror("sched_setscheduler failed:");
>> }
>>
>>
>> gettimeofday(&tv1,0);
>> gettimeofday(&tv2,0);
>> gettimeofday(&tv3,0);
>> gettimeofday(&tv4,0);
>>
>> for (;;) {
>> gettimeofday(&tv1,0);
>> usleep(50);
>> gettimeofday(&tv2,0);
>> diff=(1000000*tv2.tv_sec+tv2.tv_usec)-(1000000*tv1.tv_sec+tv1.tv_usec);
>> if (diff> 500) {
>> printf("Extensive sleep: %d usecs.\n",diff);
>> diff3=(1000000*tv2.tv_sec+tv2.tv_usec)-(1000000*tv4.tv_sec+tv4.tv_usec);
>> if (diff3> 1000000) {
>> tv4=tv2;
>> printf("Freeze interval: %d usecs.\n", diff3);
>> }
>> }
>> }
>> }
>>
>> Logika je myslím jasná - program se nechá na 50 us uspat a pak si změří, kolik
>> spal ve skutečnosti. Pokud je to více než 500 us (tj. desetkrát tolik), vypíše
>> tuto hodnotu a navíc čas, který uplynul od minulého "zaspání". Nu a je vidět,
>> že k "zaspání" dochází pravidelně po nějakých 2.34 sekundách. Pár dalších
>> poznámek:
>>
>> - Prográmek si nastavuje nejvyšší možnou real-time prioritu, nemělo by tedy
>> existovat nic, co by jej dokázalo dostat od procesoru - vždyť tam jsou 4
>> plnohodnotná jádra, jedno by mělo být pro něj vždy k dispozici.
>> - Interval mezi "zaspáními" se v čase nemění, co se ale mění, je délka
>> "zaspání", ta v čase vzrůstá. Tato ukázka s průměrnou délkou zaspání 1 - 2 ms
>> vznikla po cca dvou dnech běhu. Rekord jsem naměřil po 45 dnech, kdy už bylo
>> jedno každé zaspání od 10 do 30 ms a někdy se stávalo, že v tomto intervalu
>> se úloha na chvilku "probrala", takže se to vypsalo jako 2 - 3 menší "zaspání"
>> těsně za sebou.
>> - Na zaspání se nepodílí chod čehokoliv v systému - test byl měřen, aniž by
>> běžel jakýkoliv server (včetně toho asterisku), s odpojenými
>> a odkonfigurovanými ethernet porty, dokonce se shutdownovanými disky.
>> - Závada byla již reklamována u výrobce, který vyměnil základní desku. Nová
>> dělá totéž.
>> - Bylo testováno několik jader (2.6.34, 36, nyní 38.2) a závada se projevuje
>> zcela identicky.
>> - Na solidnějším bratříčkovi tohoto serveru (Proliant DL360 G6) běží zcela
>> identický software (instalovaný z téhož image) již nějakých 400 dní, aniž by
>> se uvedená závada jakkoliv projevila. Pokud tam spustím výše uvedený program,
>> také něco vypisuje, ale jedno zaspání kolem milisekundy se objeví v řádu
>> desítek hodin, nadto zcela stochasticky. To jsem ochoten tolerovat.
>> - I můj domácí server, řadové PC od Asusu, s výrazně slabším CPU (běžící
>> rovněž tentýž image) se chová výrazně lépe, sice "zakopne" častěji než ten
>> DL360, tak jednou za 4 - 6 hodin, ale opět zcela stochasticky a jen na
>> krátkou dobu.
>>
>> Napadá někoho, co tomu krámu je a jak tomu odpomoci ? Velmi hrubý workaround
>> je stroj každou noc rebootovat, neboť během jednoho dne nenaroste zpoždění
>> do takových hodnot, že by to vadilo (Asterisk tu milisekundu nedostupnosti
>> prostě "překlene", i data z těch E1 karet se stačí vyčíst). Je to ale jen
>> nejvyšší nouze a rozhodně to nehodlám dlouhodobě takto provozovat.
>>
>> Taky by mi pomohlo, kdyby by tu byl někdo, kdo provozuje tutéž platformu
>> a byl by ochoten si tam ten prográmek zkompilovat a na chvilku pustit, abychom
>> viděli, zda to dělají prostě všechny servery, nebo jen ten náš (přeci jen
>> nebylo vyměněno vše, např. RAID karta zůstala původní a ta by teoreticky
>> mohla např. nějakým DMA systém blokovat.
>>
>> S pozdravem Pavel
Další informace o konferenci Hw-list