Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 6958|Válasz: 1

A többszálú kezelés zsákutcába sodorja a skálázhatóságot

[Linket másol]
Közzétéve 2014. 12. 06. 22:21:58 | | |
Ez egy cikk a Python világából, de még mindig alkalmazható az egész programozási területre, bár a multithreading lehetővé teszi, hogy gyorsabban dolgozzuk fel a kéréseket, de van egy plafon, a zöld (mikroszálas) szálak a megoldás.

A többszálú szoftverfejlesztés számos problémát old, különösen olyan hálózati alkalmazásoknál, amelyek gyors reagáláshoz igényes teljesítményt igényelnek. Sajnos a multithreading nem elég a nagy léptékű megoldáshozEgyidejű egyidejűszexuális problémák.

E problémák kezeléséhez programozási modellek módosítása szükséges, aszinkron események és visszahívás-alapú mechanizmusok alkalmazásával. A Druván létrehoztunk egy python alapú könyvtárat, a Dhaga-t, hogy nagyszabású megoldásokat oldjunkEgyidejű egyidejű, míg a programozási modell nem igényel jelentős változtatásokat.

A szoftverfejlesztők egy helyen élnekEgyidejű egyidejűvilág. A szálak ma már elsőrangú állampolgárok, különösen a fejlesztés során, különösen akkor, amikor az alkalmazásod intenzív hálózati műveleteket végez, mint például az inSync rendszer (hálózati biztonsági szinkronizációs termék), mint a Druva. A multithreading megkönnyíti a hálózati műveletekhez szükséges programozási kód egyszerű és rendezett áramlását. Amikor az alkalmazásunknak teljesítményjavításra vagy fejlesztésre van szüksége, az javíthatóRugalmasság, növelhetjük a szálak számát.

De ha több ezer skáláról van szóEgyidejű egyidejűKérések, szálak nem elegendőek.

Azt tapasztaltuk, hogy a többszálas kezelésnek a következő hátrányai vannak:
1. Az inSync rendszer kliensének nagy mennyiségű fájlt kell mentenie a szerverre hálózati RPC hívásokon keresztül. A fejlesztők tipikus módja a játék felgyorsításának, ha threadeket használnak. Azonban a többszálas munka teljesítménye növeli a memória és a CPU költségét; A fejlesztőknek egyensúlyt kell tartaniuk a sebesség és a szálszám között.

2. Szervereinknek kezelniük kell az inSync rendszer és több ezer ügyfél közötti kapcsolatotEgyidejű egyidejűKapcsolatok és értesítések. A kapcsolatok hatékony kezeléséhez szálakat használunk a kérések kezelésére. De az inSync rendszer ügyfelei növekvő száma azt is jelenti, hogy tovább kell növelnünk a szálak számát, ami sok szervermemóriát és CPU-t fogyaszt.

3. Webszerverünknek több ezer párhuzamos HTTP kérést kell kezelnie. A munka nagy része azokon a hálózati socketeken van, amelyek adatokat fogadnak és küldenek, majd továbbítják az inSync rendszer háttérrendszeréhez. Ez miatt a legtöbb szál vár a hálózati műveletekre. A C10K problémát okozza, hogy amikor több ezer szinkron kérés van a webszerverre, minden kéréshez egy szál generálása meglehetősen nem skálázható (Scale).

Aszinkron keretrendszerek korlátai
Számos aszinkron keretrendszer, köztük a Twisted, Tornado Tornado és asyncore, segíthet a fejlesztőknek eltávolodni a threadek népszerű használatától. Ezek a keretrendszerek nem blokkoló socketekre és visszahívási mechanizmusokra támaszkodnak (hasonlóan a Node.js-hez). Ha ezeket a keretrendszereket úgy használjuk, hogy a Druva kódunk fő részeit újra kell kezelni. Nem ezt akarjuk csinálni. A kód refaktorálása növeli a fejlesztési és tesztelési ciklusokat, megakadályozva abban, hogy megfeleljünk a méretarányi követelményeinknek. Mivel a termék több részének is tömegesnek kell lennie, mindannyiunknak refaktorálnia kell őket – ezért kell megduplázni vagy háromszorozni.

Ahhoz, hogy elkerüljük a kód változtatását, el kellett távolodnunk a meglévő keretrendszer közvetlen használatától. Szerencsére találtunk néhány hasznos eszközt.

Mivel a hálózati I/O-n a kód végrehajtását akarjuk irányítani, szükségünk van egy szálra való felosztásra mikroszálakra. Mi megtaláljukGreenlets。 Ez egy nem implicit mikroszál ütemezést biztosít, amit co-routine korutinnak neveznek. Más szóval. Hasznos, ha irányítani akarod a kódod futását. Mikroszálakat építhetsz egyedi ütemezésekhez, mert szabályozhatod, mikor okoznak szüneteket. Ez tökéletes számunkra, mert teljes irányítást ad a kódunk ütemezése felett.

A Tornado egy egyszerű, nem blokkoló webszerver keretrendszer, amelyet Python nyelven írtak, és több ezer aszinkron kérést kezelnek. A fő összetevőjét, az IOLoop IOStream-et használjuk. Az IOLoop egy nem blokkoló socket I/O eseményciklus; Epoll-t (Linuxon) vagy sorokat (BSD és Mac OS X) használ, különben választhat (Windowson), ha elérhetők. Az IOStream nem blokkoló csatlakozókat kínál, például olvasáshoz és íráshoz kényelmes csomagolást. Minden socket műveletet átruházunk a Tornado-ra, majd visszahívásokat használunk a kódműveletek befejezéséhez (banq megjegyzés: nagyon hasonló Node.js mechanizmushoz).

Jó kezdet, de többre van szükségünk. Ha közvetlenül a fenti modult használjuk a kódunkban, sok RPC kódunknak változtatnia kell, például az RPC-t zöld leveleken keresztül ütemezni, biztosítani, hogy a zöld csatornák ne blokkolják (ha a zöld csatornák eltömődnek, az az egész szálat és a többit is eltömi), a tornádóból származó visszahívási függvényeket kezelni.

Szükségünk van egy absztrakcióra, amely kezelni és rendezze a zöld leveleket, hogy ne tömítse el őket külső hívásokkal, és ez az absztrakció hatalmas mértékben skálázható lehet a szálakon túl. Ez az absztrakció a Dhaga, amely lehetővé teszi, hogy az alkalmazás kód áramlását hagyományos szinkron sorozatként programozzák, de a végrehajtás aszinkron.

A Dhaga (hindi nyelvből, ami szálat jelent) egy egyszerű szál végrehajtási keretrendszere, amelyet abszttraktálunk. A Dhaga osztály a greenlet-ekből származik, és stack switching segítségével több kódfolyamot hajtson végre egyetlen operációs rendszer szálban. Egy operációs rendszer szálai több dhagát hajtanak végre együttműködéses ütemezéssel. Amikor egy dhaga vár (főleg egy RPC hívás visszatérésére), az irányítást ad a szülői szintre (azaz az operációs rendszer szintű szál végrehajtási kontextusára, amely létrehozta). A szülői szint ezután újabb dhagát ütemez, hogy készen álljon a futásra. Az RPC hívást továbbítják a tornádó webszervernek, hogy aszinkron módon írják meg a Socketet, majd visszahívást regisztrálnak, amikor visszatér, és amikor ez az RPC visszatér, a várakozó dhaga hozzáadódik a futtatható sorhoz, majd a szülőszál felveszi. (Banq megjegyzés: hasonló node.js elvhez)

Nagy késleltetésű műveletekhez használhatunk Dhagát szálak helyett, és 512 dhagát használunk egyetlen szálban, amikor a szálak száma meghaladja az áteresztőképesség ésszerű határát.







Előző:Az mvc keretrendszer minta halott
Következő:Az MVC keretrendszerek előnyei és hátrányai:
Közzétéve 2014. 12. 07. 17:22:55 |
Az olvasás és visszaposztolás erény
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com