Programmēšana

Izprot .net CLR pavedienu kopu

.Net Framework CLR ir atbildīgs par resursu meklēšanu lietojumprogrammu darbināšanai. Jo īpaši CLR pavedienu kopa nosaka, kad pavedieni jāpievieno vai jānoņem. Izpratne par tā darbību palīdzēs jums noteikt, kā konfigurēt lietojumprogrammu ASP.Net optimālai veiktspējai.

CLR pavedienu krājumā ir divu veidu pavedieni - darba ņēmēja pavedieni un I / O pabeigšanas ports vai IOCP pavedieni. Tas nozīmē, ka jūsu ASP.Net darbinieka procesā faktiski ir divi pavedienu kopas: darbinieka pavedienu kopa un IOCP pavedienu kopa. Dabiski, ka šiem baseiniem ir dažādi mērķi.

Kad izmantojat tādas metodes kā Uzdevums. Palaist, TaskFactory.StartNew, un ThreadPool.QueueUserWorkItemizpildlaika apstrādē tiek izmantotas strādnieku pavedieni. Kad lietojumprogrammā veicat asinhronus I / O zvanus vai lietojumprogramma piekļūst failu sistēmai, datu bāzēm, tīmekļa pakalpojumiem utt., Izpildlaiks izmanto IOCP pavedienus. Ņemiet vērā arī to, ka katram lietojumprogrammas domēnam ir savs pavedienu kopums.

Apskatīsim tuvāk, kā šie pavedieni tiek izveidoti un noņemti .Net Framework.

Vītņu iesmidzināšanas stratēģijas

.Net pavedienu kopa sāk injicēt jaunus pavedienus ikreiz, kad aizņemto pavedienu skaits kļūst vienāds ar konfigurēto minimālo pavedienu skaitu pavedienu kopā. Minimālā iestatījuma noklusējuma vērtība, kas ir minimālais iestatījumu skaitsgan darba ņēmēja un IOCP pavedieni, nosaka procesoru skaits jūsu sistēmā. Tādējādi, ja jūsu sistēmā ir četri kodoli, pēc noklusējuma jums būs četri darba pavedieni un četri IOCP pavedieni.

Pēc tam .Net pavedienu kopa pēc pieprasījuma injicē papildu darba ņēmēju pavedienus, ja tiek izmantoti esošie pavedieni un vēl ir darāms darbs. Līdzīgi, ja samazināsies pieprasījums pēc resursiem, pavedienu kopa sāks pavedienus noņemt.

Veicot šo koda fragmentu, tiks parādīts loģisko procesoru skaits jūsu sistēmā un minimālais pieejamo darbinieku un IOCP pavedienu skaits.

static void Main (virkne [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logisticsProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

Console.WriteLine (“Procesoru skaits:“ +icalProcessorCount);

Console.WriteLine (“Minimālais strādnieku pavedienu skaits:“ + minimumWorkerThreadCount);

Console.WriteLine (“Minimālais IOCP pavedienu skaits:“ + minimumIOCThreadCount);

Konsole. Lasīt ();

}

.Net pavedienu kopa vada pavedienus, izmantojot tā iebūvēto heiristiku. Pieņemtās stratēģijas ietver izvairīšanos no bada un kalnā kāpšanas algoritmu. Pirmajā gadījumā .Net pavedienu kopa turpina pievienot darba ņēmēju pavedienus, ja rindā redzamajos vienumos nav redzams progress. Pēdējā gadījumā .Net pavedienu kopa mēģina maksimāli palielināt caurlaidi, izmantojot pēc iespējas mazāk pavedienu.

.Net pavedienu kopa injicē vai noņem pavedienus ar intervālu 500 milisekundes vai kad pavediens kļūst brīvs, atkarībā no tā, kurš nosacījums notiek ātrāk. Tagad, pamatojoties uz izpildlaika laikā pieejamajām atsauksmēm, .Net pavedienu kopa vai nu noņem pavedienus, vai arī pievieno pavedienus, lai maksimāli palielinātu caurlaidspēju. Ja pavediena pievienošana nepalielina caurlaidspēju, tā noņem pavedienu. Šī ir CLR kalnā kāpšanas tehnika darbībā.

Tagad pieņemsim, ka lietojat savu ASP.Net lietojumprogrammu IIS, un jūsu tīmekļa serverī kopā ir četri procesori. Pieņemsim, ka jebkurā brīdī ir jāapstrādā 24 pieprasījumi. Pēc noklusējuma izpildlaiks izveidotu četrus pavedienus, kas būtu pieejami pirmo četru pieprasījumu apkalpošanai. Tā kā papildu pavedieni netiks pievienoti, kamēr nebūs pagājušas 500 milisekundes, pārējie 20 pieprasījumi būs jāgaida rindā. Kad ir pagājušas 500 milisekundes, tiek izveidots jauns pavediens.

Kā redzat, darba slodzes sasniegšanai būs nepieciešami daudzi 500 ms intervāli. Tas ir labs iemesls asinhronās programmēšanas izmantošanai. Izmantojot asinhrono programmēšanu, pavedieni netiek bloķēti, kamēr tiek apstrādāti pieprasījumi, tāpēc četri pavedieni tiks atbrīvoti gandrīz nekavējoties.

Ieteicamie pavedienu iestatījumi

Ņemot vērā .Net pavedienu kopas darbību un to, ko mēs līdz šim esam apsprieduši, ir ļoti ieteicams gan darba ņēmēja, gan IOCP pavedieniem mainīt minimālo konfigurācijas vērtību - noklusējuma vērtību. Lai to izdarītu ASP.Net, jums vajadzētu mainīt minWorkerThreads un minIoThreads konfigurācijas iestatījumi sadaļā konfigurācijas elements jūsu sistēmas failā machine.config.

minIoThreads = ”šeit norādiet vēlamo vērtību” />

Gan darba ņēmēja, gan IOCP pavedieniem var iestatīt minimālās konfigurācijas vērtības uz jebkuru vērtību no viena līdz 50. Laba pieeja ir IIS darbinieka procesa (W3wp.exe) lietotāja režīma procesa izgāšana un pēc tam ! threadpool komandu ziņot par visu strādnieku pavedienu skaitu. Tiklīdz jūs zināt šo vērtību, vienkārši sadaliet to ar procesora serdeņu skaitu jūsu sistēmā, lai noteiktu minimālos darba ņēmēja un IOCP pavedienu iestatījumus. Piemēram, ja kopējais strādnieku pavedienu skaits ir 100 un jūsu sistēmā ir četri procesori, jūs varat iestatīt minimālās vērtības gan darba ņēmēja, gan IOCP pavedieniem uz 25.

Lai mainītu noklusējuma minimālos pavedienu iestatījumus ārpus ASP.Net, varat izmantot ThreadPool.SetMinThreads () metodi.

Lai uzlabotu pavedienu pārvaldību un uzlabotu veiktspēju, CLR pavedienu kopa ir uzlabota ar katru CLR versiju. Piemēram, ar .Net Framework 4 CLR ieguva pavedienu zagšanas algoritmus un atbalstu vienlaicīgumam un paralēlismam. Ar katru jauno CLR versiju .Net pavedienu kopa kļūst gudrāka par caurlaides optimizēšanu, pēc vajadzības izveidojot un iznīcinot pavedienus. Tikmēr vēlaties izmēģināt dažādus minimālos pavedienu iestatījumus, lai jūsu .Net lietojumprogramma sniegtu vislabāko sniegumu.

$config[zx-auto] not found$config[zx-overlay] not found