RE: Počet vláken

Zuffa Jan ZuffaJ na cgc.sk
Úterý Prosinec 15 10:40:56 CET 2020


Zdravim,

Vsak tie data aj tak prichadzaju po jednom drote.

j.

-----Original Message-----
From: Hw-list <hw-list-bounces na list.hw.cz> On Behalf Of Ondrej Janovský
Sent: Tuesday, December 15, 2020 10:11 AM
To: hw-list na list.hw.cz
Subject: Re: Počet vláken

Zdravím,

nejdříve k druhé otázce. Ano, šlo by to a už to zde navrhovali, pool hotových vláken, ze kterých si berete když potřebujete a vracíte zpět po vykonání potřebného.

A k první, to Vám opravdu trvá vytvoření vlákna tak dlouho, že je PLC netrpělivé? Jaký má timeout?

Doporučuji to přepsat s využitím asynchronních neblokujících operací. 
Když to dobře napíšete, vystačíte si s pár vlákny pro mraky PLC.

Ve zjednodušeném popisu, máte frontu(pole) otevřených socketů a projíždíte je jedním vláknem. Pokud má socket v bufferu přijatá data, zpracujete je co nejrychleji (tj. bez čekání na kompletní zprávu) a jdete na další socket.

Ony se totiž data obecně trousí trochu jako švábi na pivo, takže čekat na celou zprávu v jednom vlákně je nevýhodné, protože za tu dobu stihnete obsloužit spoustu jiných dat na jiných socketech.

Tak a teď co s pár bajty dat, když to není celá zpráva Modbusu? Jak zpracovat Modbus po částech?
Buď máte k dispozici parser Modbusu, který s tím počítá, v mém světě například objekt, který si drží stav zpracování a kdykoliv mám pro něj nová data ze socketu, tak mu je předám do jeho metody na zpracování. To dělám pořád v rámci toho jednoho vlákna. A opět se řídím pravidlem, zpracovat maximálně rychle (tj. žádné sleep, pokud možno žádné čekání na jiná vlákna, souborové operace), jen rozparsovat kus zprávy Modbus a honem se vrátit na další socket. A nebo nemáte a nechcete si ho napsat, pak prostě zprávu místo parsování jen skládejte a počítejte timeout od posledního bajtu. (V obecné komunikaci na Internetu cesta do pekel, protože nějaká část dat se může zdržet déle, než je timeout na poznání celé zprávy). Já předpokládám dál, že máme asynchronní Modbus parser.

A pak nastane stav, že mi dorazila poslední várka dat z Modbus zprávy. 
Takže je opět vezmu, parser zjistí, že má všechno hotové a zná detaily celé zprávy. Takže může zavolat další metody z jiných objektů a dál provádět to co je nutné se zprávou provést (opět maximálně rychle), případně do socketu rovnou dáte odpověď, pokud to jde.

Nejjednodušší a nejrychlejší řešení bude hotový objekt rozparsované zprávy dát do fronty. A o tu se bude starat druhé vlákno, nebo klidně více vláken a bude dál data zpracovávat.

Složitější řešení (spíše na popis v tomto emailu) by bylo řetězit zpracování do rychlých operací za sebou a k použití vláken se uchylovat jen tam, kde už se bude chvíli čekat, například pokud ukládám data do logu nebo databáze. Ale hlavně nečekat v tom primárním vlákně na potvrzení uložení. Až bude uloženo, může se v rámci nového vlákna pokračovat na další operaci, nebo znovu opakovat uložení v případě nedostupnosti databáze, nebo prostě vrátit vlákno do poolu či zahodit.

Tímto způsobem jste schopen si vystačit s relativně málo vlákny na obsluhu ne 100+ PLC, ale 1000+ (tady jsem příliš skromný, viz. NGINX server)

V Lazarusu tímto způsobem také můžete pracovat https://wiki.freepascal.org/Asynchronous_Calls a https://wiki.lazarus.freepascal.org/lNet mohou být odrazovým můstkem.

Oja




Dne 10. 12. 20 v 12:33 Martin Záruba napsal(a):
> Ještě by mě zajímal Váš názor, na tuto úpravu: Teď to funguje tak, že 
> jedno vlákno čeká na připojení. Pokud k němu dojde, vytvoří se další 
> vlákno a předá se mu řízení. Jenže někdy se stane, že PLC se připojí 
> dvakrát. Mohlo by to být tím, že než se stihne vlákno vytvořit, myslí 
> si, že se spojení nepodařilo a PLC se pokusí znovu?
>
> A pokud ano, mohlo by pomoct, že by se nejprve všechna vlákna založila 
> a pak, když se PLC připojí, by se jen předalo vláknu řízení?
>
> Martin Záruba
>
> Dne 10.12.2020 v 12:11 Radek Sztwiorok napsal(a):
>> Ten pocet problem nebude.
>> Mne tu aktualne bezi  do diagnostiky napsane v lazarusu na modbusu
>> 236 zarizeni a nekope se to. Tam bude nekde chybka v programu.
>>
>> čt 10. 12. 2020 v 11:59 odesílatel Marek Sembol <hwm.land na gmail.com 
>> <mailto:hwm.land na gmail.com>> napsal:
>>
>>     Jak rikam - Lazarusi detaily neznam, ale sockety
>>     podporuji non-blocking operace snad 'odjakziva' - a presne tak se
>>     to taky v servrech resi.
>>     Pravda - v dnesni dobe uz je to lepe zabaleno, takze v .NET pred
>>     4.0 to byly pary metod BeginNeco/EndNeco, od 4.0 jeste
>>     jednoduzsi pouziti pomoci NecoAsync
>>     Verim tomu, ze Lazarus bude mit taky podporu
>>
>>     PS: rozumim tomu spravne, ze vam tam komunikuje 120+ PLC?
>>     BR,
>>     Marek
>>
>>     On Thu, Dec 10, 2020 at 11:25 AM Martin Záruba <swz na volny.cz
>>     <mailto:swz na volny.cz>> wrote:
>>
>>         No já to vlastně takto předělal z verze, kdy bylo jedno
>>         vlákno. Ono to v
>>         podstatě funguje tak, že se připojí klient (PLC). Server
>>         vyhodnotí, že
>>         je to oprávněné připojení a pak se již stará o komunikaci. 
>> Tím
>>         pádem PLC
>>         může být za firewallem a nemusí mít veřejnou IP. Problém je v
>>         tom, že
>>         komunikace běží na pomalém modbusu, takže naprostá většina
>>         doby je
>>         čekání na data. Pokud to jsou vlákna, tak to není problém,
>>         protože se o
>>         to stará systém a i na prastarém procesoru je vytížení
>>         zanedbatelné.
>>         Jenže nedovedu si představit, jak se jedno vlákno bude starat 
>> o
>>         komunikaci s několika zcela asynchronně běžícími procesy.
>>
>>         Jinak tak, jak jste to popsal to funguje, jenže jekmile
>>         naslouchací
>>         vlákno identifikuje požadavek a spustí to komunikační, dál se
>>         o to
>>         nestará. To je mi jasné, jenže to komunikační vlákno vlastně
>>         nikdy
>>         nekončí, protože je to smyčka, která čte data (nebo i
>>         zapisuje) z PLC
>>         tak rychle, jak to modbus zvládne. Pokud spojení spadne,
>>         vlákno se
>>         ukončí a PLC se pokusí přihlásit znovu a zase dostane vlákno.
>>         Tak mě
>>         nenapadá, jak to udělat jinak.
>>
>>         Martin Záruba
>>
>>         Dne 10.12.2020 v 7:33 Marek Sembol napsal(a):
>>         > Zdravim,
>>         > Lazara neznam ani omylem, ale: Ono chyba 'out of memory'
>>         nemusi nutne
>>         > znamenat, ze dosla pamet obecne. Mnohdy ma program/system
>>         vyhrazenou
>>         > statickou (pevne delky) tabulku na nejake prostredky pokud
>>         nema volny
>>         > slot - vyhodi out-of-memory (a ma pravdu-dosla mu vyhrazena
>>         pamet) Na
>>         > podobny problem jsem narazil jednou s .NET (tehdy jeste 
>> 3.5)
>>         Program
>>         > pomerne intenzivne (az agresivne) vyuzival thready z
>>         ThreadPool.
>>         > Problem byl, ze tam byl taky pevny strop - a jeste zavisly
>>         na poctu
>>         > jader. Tusim 256/jadro.
>>         > Obecna rada - ono stejne neni pro system moc zdrave drzet 
>> si
>>         stabilne
>>         > tolik thready. Kazda sranda (thread) neco stoji. Ten thread
>>         dokonce
>>         > relativne dost.
>>         > Takze moje rada vas nepotesi - predelat strukturu programu, 
>> aby
>>         > nepotreboval tolik threadu. Neco jako jeden thread na
>>         naslouchani a v
>>         > pripade prichoziho pozadavku, si docasne vytvorit (nejlepe
>>         pouzit z
>>         > thread pool, pokud lazarus ma, jinak si napsat svuj. 
>> Tvoreni
>>         thredu je
>>         > hodne drahe) threadik na zpracovani pozadavku a pak ho
>>         zas hezky
>>         > vratit/uklidit.
>>         > BR,
>>         > Marek
>>         >
>>         > On Thu, Dec 10, 2020 at 6:51 AM Martin Záruba <swz na volny.cz
>>         <mailto:swz na volny.cz>
>>         > <mailto:swz na volny.cz <mailto:swz na volny.cz>>> wrote:
>>         >
>>         >     Mám v prostředí Lazarus program, který po připojení 
>> přes
>>         TCP/IP
>>         >     založí
>>         >     vlákno a provede příslušnou akci. Pokud ale počet 
>> vláken
>>         dosáhne
>>         >     hodnoty
>>         >     115 dostanu zprávu
>>         >
>>         >     Project xxx vyvolal výjímku třídy ´EThread´ se zprávou:
>>         >
>>         >     Thread creation error: K provedení tohoto příkazu není 
>> dost
>>         >     paměťových
>>         >     prostředků
>>         >
>>         >
>>         >     Jenže ono to nezáleží na paměti. Na různých PC se to
>>         chová stejně.
>>         >     Zjevně někde přetečou nějaké tabulky. Ale kde?
>>         >
>>         >     --
>>         >
>>         >     Martin Záruba
>>         >
>>         >     _______________________________________________
>>         >     HW-list mailing list  -  sponsored by www.HW.cz
>>         <http://www.HW.cz> <http://www.HW.cz <http://www.HW.cz>>
>>         > Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>         <mailto:Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>>
>>         > http://list.hw.cz/mailman/listinfo/hw-list
>>         <http://list.hw.cz/mailman/listinfo/hw-list>
>>         >     <http://list.hw.cz/mailman/listinfo/hw-list
>>         <http://list.hw.cz/mailman/listinfo/hw-list>>
>>         >
>>         >
>>         > _______________________________________________
>>         > HW-list mailing list  -  sponsored by www.HW.cz
>>         <http://www.HW.cz>
>>         > Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>         > http://list.hw.cz/mailman/listinfo/hw-list
>>         <http://list.hw.cz/mailman/listinfo/hw-list>
>>         _______________________________________________
>>         HW-list mailing list  -  sponsored by www.HW.cz 
>> <http://www.HW.cz>
>>         Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>         http://list.hw.cz/mailman/listinfo/hw-list
>>         <http://list.hw.cz/mailman/listinfo/hw-list>
>>
>>     _______________________________________________
>>     HW-list mailing list  -  sponsored by www.HW.cz 
>> <http://www.HW.cz>
>>     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>>     http://list.hw.cz/mailman/listinfo/hw-list
>>     <http://list.hw.cz/mailman/listinfo/hw-list>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz 
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz 
> http://list.hw.cz/mailman/listinfo/hw-list


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list