Oğurlamaq: virtual maşınlardan CPU vaxtını kim oğurlayır

Oğurlamaq: virtual maşınlardan CPU vaxtını kim oğurlayır

Salam! Mən sizə virtual maşınların daxilindəki oğurluq mexanikası və bulud platformasının texniki direktoru kimi araşdırmaq zamanı tapdığımız bəzi qeyri-aşkar artefaktlar haqqında sadə sözlərlə danışmaq istəyirəm. Mail.ru Bulud Həlləri. Platforma KVM üzərində işləyir.

CPU oğurlama vaxtı virtual maşının icrası üçün prosessor resurslarını almadığı vaxtdır. Bu vaxt yalnız virtuallaşdırma mühitlərində qonaq əməliyyat sistemlərində sayılır. Bu ən çox ayrılan resursların hara getməsinin səbəbləri, həyatda olduğu kimi, çox qeyri-müəyyəndir. Ancaq biz bunu anlamağa qərar verdik və hətta bir sıra təcrübələr apardıq. İndi oğurluq haqqında hər şeyi bildiyimiz deyil, amma indi sizə maraqlı bir şey söyləyəcəyik.

1. Oğurluq nədir

Beləliklə, oğurlamaq virtual maşındakı proseslər üçün prosessor vaxtının çatışmazlığını göstərən bir metrikdir. Təsvir edildiyi kimi KVM ləpəsindəGizlilik, hipervizorun virtual maşın prosesini icra üçün növbəyə qoymasına baxmayaraq, host ƏS-də digər prosesləri yerinə yetirdiyi vaxtdır. Yəni oğurluq prosesin icraya hazır olduğu vaxt ilə prosesə prosessor vaxtının ayrıldığı vaxt arasındakı fərq kimi hesablanır.

Virtual maşın ləpəsi hipervizordan oğurluq metrikasını alır. Eyni zamanda, hipervizor başqa hansı prosesləri işlədiyini dəqiq göstərmir, sadəcə olaraq “məşğul olduğum müddətdə sizə vaxt verə bilmərəm” deyir. KVM-də oğurluq hesablama dəstəyi əlavə edildi yamaqlar. Burada iki əsas məqam var:

  • Virtual maşın oğurluğu hipervizordan öyrənir. Yəni, itkilər baxımından, virtual maşındakı proseslər üçün bu, müxtəlif təhriflərə məruz qala bilən dolayı ölçüdür.
  • Hipervizor virtual maşınla başqa nə etdiyi barədə məlumat paylaşmır - əsas odur ki, ona vaxt ayırmır. Bu səbəbdən, virtual maşın özü oğurluq göstəricisindəki təhrifləri aşkar edə bilmir və bu, rəqabət proseslərinin təbiəti ilə qiymətləndirilə bilər.

2. Oğurluğa nə təsir edir

2.1. Oğurluq hesablaması

Əsasən, oğurluq normal CPU istifadə vaxtı ilə təxminən eyni hesablanır. Təkrar emalın necə nəzərdən keçirildiyi barədə çox məlumat yoxdur. Yəqin ki, insanların çoxu bu sualı açıq hesab edir. Ancaq burada tələlər də var. Bu proseslə tanış olmaq üçün oxuya bilərsiniz Brendan Gregg tərəfindən məqalə: istifadəni hesablayarkən bir çox nüanslar və bu hesablamanın aşağıdakı səbəblərə görə səhv olacağı vəziyyətlər haqqında öyrənəcəksiniz:

  • Prosessor həddən artıq qızır və bu, dövrlərin keçməsinə səbəb olur.
  • Prosessorun saat sürətini dəyişən turbo təkanını aktivləşdirin/deaktiv edin.
  • SpeedStep kimi prosessorun enerjiyə qənaət edən texnologiyalarından istifadə zamanı baş verən zaman diliminin uzunluğunda dəyişiklik.
  • Orta hesablama problemi: bir dəqiqəlik istifadənin 80% qiymətləndirilməsi 100% qısa müddətli partlayışı gizlədə bilər.
  • Döndürmə kilidi prosessorun geri alınmasına səbəb olur, lakin istifadəçi prosesi onun icrasında heç bir irəliləyiş görmür. Nəticədə prosessorun fiziki olaraq prosessor vaxtını sərf etməyəcəyinə baxmayaraq, proses tərəfindən hesablanmış prosessor istifadəsi yüz faiz olacaq.

Oğurluq üçün oxşar hesablamanı təsvir edən məqalə tapmadım (bilirsinizsə, şərhlərdə paylaşın). Ancaq mənbə koduna görə hesablama mexanizmi təkrar emal ilə eynidir. Sadəcə olaraq, nüvəyə birbaşa KVM prosesi (virtual maşın prosesi) üçün başqa sayğac əlavə olunur ki, bu da KVM prosesinin CPU vaxtını gözləyən müddətini hesablayır. Sayğac prosessor haqqında məlumatı onun spesifikasiyasından götürür və onun bütün işarələrinin virtual maşın prosesi tərəfindən istifadə edilib-edilmədiyini yoxlayır. Hamısı belədirsə, prosessorun yalnız virtual maşın prosesi ilə məşğul olduğunu güman edirik. Əks halda, prosessorun başqa bir şey etdiyini bildiririk, oğurluq meydana çıxdı.

Oğurluq hesablama prosesi müntəzəm təkrar hesablama ilə eyni problemlərə məruz qalır. Demək olmaz ki, bu cür problemlər tez-tez yaranır, amma ruhdan salan görünür.

2.2. KVM-də virtuallaşdırma növləri

Geniş mənada desək, üç növ virtualizasiya var, bunların hamısı KVM tərəfindən dəstəklənir. Oğurluğun baş vermə mexanizmi virtuallaşdırmanın növündən asılı ola bilər.

Broadcast. Bu vəziyyətdə, virtual maşın əməliyyat sisteminin fiziki hipervizor cihazları ilə işləməsi belə bir şey baş verir:

  1. Qonaq əməliyyat sistemi qonaq cihazına əmr göndərir.
  2. Qonaq cihaz sürücüsü əmri alır, cihazın BIOS-u üçün sorğu yaradır və onu hipervizora göndərir.
  3. Hipervisor prosesi əmri fiziki cihaz üçün əmrə çevirərək onu digər şeylərlə yanaşı daha təhlükəsiz edir.
  4. Fiziki cihaz sürücüsü dəyişdirilmiş əmri qəbul edir və onu fiziki cihazın özünə göndərir.
  5. Əmrlərin yerinə yetirilməsinin nəticələri eyni yolla geri qayıdır.

Tərcümənin üstünlüyü ondan ibarətdir ki, o, istənilən cihazı təqlid etməyə imkan verir və əməliyyat sisteminin nüvəsinin xüsusi hazırlanmasını tələb etmir. Ancaq bunun üçün ilk növbədə sürətə görə ödəməlisiniz.

Avadanlığın virtuallaşdırılması. Bu halda, aparat səviyyəsindəki cihaz əməliyyat sistemindən gələn əmrləri başa düşür. Bu, ən sürətli və ən yaxşı yoldur. Ancaq təəssüf ki, bütün fiziki cihazlar, hipervizorlar və qonaq əməliyyat sistemləri tərəfindən dəstəklənmir. Hazırda hardware virtualizasiyasını dəstəkləyən əsas qurğular prosessorlardır.

Paravirtuallaşdırma. KVM-də cihazın virtuallaşdırılması üçün ən ümumi seçim və ümumiyyətlə qonaq əməliyyat sistemləri üçün ən çox yayılmış virtuallaşdırma rejimi. Onun özəlliyi ondadır ki, bəzi hipervizor alt sistemləri ilə işləmək (məsələn, şəbəkə və ya disk yığını ilə) və ya yaddaş səhifələrinin ayrılması hipervizor API-dən istifadə etməklə, aşağı səviyyəli əmrləri tərcümə etmədən baş verir. Bu virtuallaşdırma metodunun dezavantajı ondan ibarətdir ki, qonaq əməliyyat sisteminin nüvəsi dəyişdirilməlidir ki, o, bu API-dən istifadə edərək hipervizorla əlaqə saxlaya bilsin. Ancaq bu, adətən qonaq əməliyyat sistemində xüsusi sürücülərin quraşdırılması ilə həll olunur. KVM-də bu API adlanır virtio API.

Paravirtuallaşdırma ilə, yayımla müqayisədə, virtual maşından birbaşa hostdakı hipervizor prosesinə əmrlər göndərməklə fiziki cihaza gedən yol əhəmiyyətli dərəcədə azalır. Bu, virtual maşın daxilində bütün təlimatların icrasını sürətləndirməyə imkan verir. KVM-də bu, yalnız şəbəkə və ya disk adapteri kimi müəyyən cihazlar üçün işləyən virtio API tərəfindən həyata keçirilir. Buna görə virtual maşınlarda virtio sürücülər quraşdırılır.

Bu sürətlənmənin mənfi tərəfi odur ki, virtual maşının daxilində işləyən bütün proseslər onun daxilində qalmır. Bu, oğurluq zamanı yumurtlama ilə nəticələnə biləcək bəzi xüsusi effektlər yaradır. Bu məsələnin ətraflı öyrənilməsinə başlamağı məsləhət görürəm Virtual I/O üçün API: virtio.

2.3. "Ədalətli" planlaşdırma

Hipervisordakı virtual maşın, əslində, Linux nüvəsində planlaşdırma qanunlarına (proseslər arasında resurs paylanması) tabe olan adi bir prosesdir, ona görə də gəlin ona daha yaxından nəzər salaq.

Linux, nüvə 2.6.23-dən bəri defolt planlaşdırıcıya çevrilmiş CFS, Tamamilə Ədalətli Planlayıcıdan istifadə edir. Bu alqoritmi başa düşmək üçün Linux Kernel Architecture və ya mənbə kodunu oxuya bilərsiniz. CFS-nin mahiyyəti prosessor vaxtını onların icra müddətindən asılı olaraq proseslər arasında bölüşdürməkdir. Bir proses nə qədər çox CPU vaxtı tələb edirsə, o qədər az CPU vaxtı alır. Bu, bütün proseslərin "ədalətli" yerinə yetirilməsini təmin edir - beləliklə, bir proses bütün prosessorları daim işğal etmir və digər proseslər də yerinə yetirilə bilər.

Bəzən bu paradiqma maraqlı əsərlərə gətirib çıxarır. Uzun müddət Linux istifadəçiləri, kompilyator kimi resurs tutumlu proqramları işləyərkən, yəqin ki, masaüstündə adi mətn redaktorunun dondurulduğunu xatırlayırlar. Bu, masaüstü proqramlardakı resurs tutumlu olmayan tapşırıqların tərtibçi kimi resurs tutumlu tapşırıqlarla rəqabət aparması səbəbindən baş verdi. CFS bunun ədalətsiz olduğunu düşünür, ona görə də vaxtaşırı mətn redaktorunu dayandırır və prosessorun tərtibçinin tapşırıqlarını yerinə yetirməsinə imkan verir. Bu, bir mexanizm istifadə edərək düzəldildi planlı_avtoqrup, lakin vəzifələr arasında prosessor vaxtının paylanmasının bir çox digər xüsusiyyətləri qaldı. Əslində, bu, CFS-də hər şeyin nə qədər pis olduğuna dair bir hekayə deyil, prosessor vaxtının "ədalətli" paylanmasının ən əhəmiyyətsiz iş olmadığına diqqəti cəlb etmək cəhdidir.

Planlayıcıda başqa bir vacib məqam qabaqcadan istifadədir. Bu prosessordan snickering prosesini çıxarmaq və başqalarının işləməsinə icazə vermək üçün lazımdır. Ejeksiyon prosesinə kontekst keçidi deyilir. Bu halda, tapşırığın bütün konteksti qorunur: yığının vəziyyəti, registrlər və s., bundan sonra proses gözləməyə göndərilir və yerini başqası tutur. Bu, OS üçün bahalı əməliyyatdır və nadir hallarda istifadə olunur, lakin bununla bağlı heç bir problem yoxdur. Tez-tez kontekst dəyişdirilməsi OS-də bir problemi göstərə bilər, lakin adətən davamlıdır və xüsusi bir şey göstərmir.

Bir faktı izah etmək üçün belə uzun hekayə lazımdır: bir proses vicdanlı Linux planlayıcısında nə qədər çox prosessor resursu sərf etməyə çalışarsa, digər proseslərin də işləməsi üçün bir o qədər tez dayandırılacaqdır. Bunun düzgün olub-olmaması müxtəlif yüklər altında fərqli şəkildə həll edilə bilən mürəkkəb bir sualdır. Windows-da, son vaxtlara qədər, planlayıcı fon proseslərinin donmasına səbəb ola biləcək masa üstü proqramların prioritet işlənməsinə yönəldilmişdir. Sun Solarisin beş müxtəlif sinif planlayıcısı var idi. Virtuallaşdırmanı işə saldığımız zaman altıncısını əlavə etdik. Ədalətli pay planlayıcısı, çünki əvvəlki beş Solaris Zones virtualizasiyası ilə adekvat işləmədi. kimi kitablarla bu məsələnin ətraflı öyrənilməsinə başlamağı tövsiyə edirəm Solaris Daxili: Solaris 10 və OpenSolaris Kernel Architecture və ya Linux nüvəsini başa düşmək.

2.4. Oğurluğa necə nəzarət etmək olar?

Virtual maşın daxilində oğurluğun monitorinqi, hər hansı digər prosessor metrikləri kimi, sadədir: istənilən prosessor ölçü alətindən istifadə edə bilərsiniz. Əsas odur ki, virtual maşın Linux-dadır. Nədənsə Windows bu məlumatı istifadəçilərinə təqdim etmir. 🙁

Oğurlamaq: virtual maşınlardan CPU vaxtını kim oğurlayır
Üst əmrin çıxışı: prosessor yükünün təfərrüatları, ən sağ sütunda - oğurlamaq

Bu məlumatı hipervizordan əldə etməyə çalışarkən çətinlik yaranır. Siz ana maşında oğurluğu proqnozlaşdırmağa cəhd edə bilərsiniz, məsələn, Orta Yükləmə (LA) parametrindən - icra növbəsində gözləyən proseslərin sayının orta dəyərindən istifadə etməklə. Bu parametrin hesablanması üsulu sadə deyil, lakin ümumiyyətlə, prosessor iplərinin sayı ilə normallaşdırılan LA 1-dən çox olarsa, bu, Linux serverinin bir şeylə həddindən artıq yükləndiyini göstərir.

Bütün bu proseslər nəyi gözləyir? Aydın cavab prosessordur. Ancaq cavab tamamilə düzgün deyil, çünki bəzən prosessor pulsuzdur, lakin LA miqyasından çıxır. Yadda saxla NFS necə düşür və LA necə böyüyür. Eyni şey disk və digər giriş/çıxış cihazları ilə də baş verə bilər. Amma əslində proseslər istər fiziki, istər I/O cihazı ilə əlaqəli, istərsə də mutex kimi məntiqi hər hansı kilidin sonunu gözləyə bilər. Buraya həmçinin aparat səviyyəsində kilidləmə (diskdən eyni cavab) və ya məntiq (bir dəstə varlıqlar, mutex adaptiv və spin, semaforlar, vəziyyət dəyişənləri, rw kilidləri, ipc kilidləri daxil olan sözdə kilidləmə primitivləri) daxildir. ...).

LA-nın başqa bir xüsusiyyəti onun əməliyyat sistemi ortalaması kimi qəbul edilməsidir. Məsələn, bir fayl üçün 100 proses yarışır, sonra isə LA=50. Belə böyük bir dəyər əməliyyat sisteminin pis olduğunu göstərir. Ancaq digər əyri yazılmış kodlar üçün bu, yalnız pis olmasına və əməliyyat sistemindəki digər proseslərin əziyyət çəkməməsinə baxmayaraq, normal bir vəziyyət ola bilər.

Bu orta hesablamaya görə (və ən azı bir dəqiqə ərzində) LA göstəricisi ilə hər hansı bir şeyi müəyyən etmək ən yaxşı iş deyil, xüsusi hallarda çox qeyri-müəyyən nəticələr var. Bunu anlamağa çalışsanız, görərsiniz ki, Vikipediya və digər mövcud resurslardakı məqalələr prosesin dərin izahı olmadan yalnız ən sadə halları təsvir edir. Maraqlanan hər kəsə yenə göndərirəm burada Brendan Gregg üçün  - aşağıdakı linkləri izləyin. Kim ingiliscə danışmaq üçün çox tənbəldir - LA haqqında məşhur məqaləsinin tərcüməsi.

3. Xüsusi effektlər

İndi isə rastlaşdığımız əsas oğurluq hallarına nəzər salaq. Yuxarıda göstərilənlərin hamısını necə izlədiklərini və hipervizordakı göstəricilərlə necə əlaqəli olduqlarını sizə xəbər verəcəyəm.

Təkrar emal. Ən sadə və ən ümumi: hipervizor yenidən istifadə edilmişdir. Həqiqətən, çoxlu işləyən virtual maşınlar, onların içərisində yüksək prosessor istehlakı, çox rəqabət, LA istifadəsi 1-dən çoxdur (prosessor ipləri ilə normallaşdırılır). Bütün virtual maşınlarda hər şey yavaşlayır. Hipervisordan ötürülən oğurluq da artır, yükü yenidən bölüşdürmək və ya kimisə söndürmək lazımdır. Ümumiyyətlə, hər şey məntiqlidir və başa düşüləndir.

Paravirtuallaşdırma və Tək Nümunələr. Hipervizorda yalnız bir virtual maşın var, o, onun kiçik bir hissəsini istehlak edir, lakin məsələn, diskdə böyük bir I/O yükü yaradır. Və bir yerdən 10% -ə qədər kiçik bir oğurluq görünür (bir neçə təcrübədə göstərildiyi kimi).

Dava maraqlıdır. Oğurluq burada məhz paravirtuallaşdırılmış sürücülər səviyyəsində bloklandığı üçün görünür. Virtual maşın daxilində fasilə yaradılır, sürücü tərəfindən emal edilir və hipervizora göndərilir. Hipervizorda kəsilmənin idarə edilməsi səbəbindən virtual maşın üçün göndərilmiş sorğu kimi görünür, icraya hazırdır və prosessoru gözləyir, lakin ona prosessor vaxtı verilmir. Virtual qız bu vaxtın oğurlandığını düşünür.

Bu, buferin göndərildiyi anda baş verir, o, hipervizorun nüvə sahəsinə daxil olur və biz onu gözləməyə başlayırıq. Baxmayaraq ki, virtual maşın baxımından o, dərhal qayıtmalıdır. Buna görə də oğurluq hesablama alqoritminə görə bu dəfə oğurlanmış hesab olunur. Çox güman ki, bu vəziyyətdə başqa mexanizmlər ola bilər (məsələn, bəzi digər sistem zənglərini emal etmək), lakin onlar çox fərqli olmamalıdır.

Planlayıcı yüksək yüklənmiş virtual maşınlara qarşı. Bir virtual maşın digərlərindən daha çox oğurluqdan əziyyət çəkəndə bu, planlaşdırıcı ilə bağlıdır. Proses prosessoru nə qədər çox yükləsə, planlaşdırıcı bir o qədər tez onu çıxaracaq ki, digərləri də işləyə bilsin. Virtual maşın az istehlak edərsə, o, çətin ki, oğurluq görəcək: onun prosesi vicdanla oturdu və gözlədi, ona daha çox vaxt verməliyik. Əgər virtual maşın bütün nüvələrində maksimum yük yaradırsa, o, tez-tez prosessordan qovulur və ona çox vaxt verməməyə çalışırlar.

Virtual maşındakı proseslər məlumatların işlənməsinin öhdəsindən gələ bilmədiyi üçün daha çox prosessor əldə etməyə çalışdıqda daha da pisdir. Sonra hipervizordakı əməliyyat sistemi, dürüst optimallaşdırma sayəsində daha az prosessor vaxtını təmin edəcəkdir. Bu proses uçqun kimi baş verir və oğurluq səmaya sıçrayır, baxmayaraq ki, digər virtual maşınlar bunu çətinliklə hiss edə bilər. Və daha çox nüvə, təsirlənmiş maşın daha pisdir. Bir sözlə, çoxlu nüvələrə malik yüksək yüklü virtual maşınlar ən çox əziyyət çəkir.

Aşağı LA, lakin oğurluq var. Əgər LA təxminən 0,7-dirsə (yəni hipervizor az yüklənmiş kimi görünür), lakin fərdi virtual maşınlarda oğurluq müşahidə olunur:

  • Paravirtuallaşdırma ilə seçim yuxarıda təsvir edilmişdir. Hipervisor yaxşı olsa da, virtual maşın oğurluq göstəricilərini qəbul edə bilər. Təcrübələrimizin nəticələrinə görə, bu oğurluq seçimi 10% -dən çox deyil və virtual maşın daxilində tətbiqlərin işinə ciddi təsir göstərməməlidir.
  • LA parametri səhv hesablanıb. Daha dəqiq desək, hər bir konkret anda düzgün hesablanır, lakin bir dəqiqə ərzində orta hesabla götürüldükdə az qiymətləndirilir. Məsələn, hipervizorun hər üçdə bir virtual maşını bütün prosessorlarını tam yarım dəqiqə ərzində istehlak edərsə, hipervizorda dəqiqədə LA 0,15 olacaq; Eyni zamanda işləyən dörd belə virtual maşın 0,6 verəcək. Onların hər birində yarım dəqiqə ərzində LA göstəricisinə görə 25% vəhşi oğurluq olması artıq çıxarıla bilməz.
  • Yenə də kiminsə çox yemək yediyinə qərar verən və kiminsə gözləməsinə icazə verən planlayıcıya görə. Bu vaxt mən konteksti dəyişəcəyəm, kəsilmələri idarə edəcəyəm və digər vacib sistem işlərinə baxacağam. Nəticədə bəzi virtual maşınlar heç bir problem görmür, digərləri isə ciddi performans deqradasiyası yaşayır.

4. Digər təhriflər

Virtual maşında prosessor vaxtının ədalətli qaytarılmasını təhrif etmək üçün daha bir milyon səbəb var. Məsələn, hyperthreading və NUMA hesablamalarda çətinliklər yaradır. Onlar prosesin yerinə yetirilməsi üçün ləpə seçimini tamamilə qarışdırırlar, çünki planlaşdırıcı konteksti dəyişdirərkən hesablamağı daha da çətinləşdirən əmsallardan - çəkilərdən istifadə edir.

Turbo boost və ya əksinə, enerjiyə qənaət rejimi kimi texnologiyalara görə təhriflər var ki, bu da istifadəni hesablayarkən serverdə tezliyi və ya hətta vaxt dilimini süni şəkildə artıra və ya azalda bilər. Turbo boost-un işə salınması, digərinin performansının artması səbəbindən bir prosessor ipinin performansını azaldır. Bu anda, cari prosessor tezliyi haqqında məlumat virtual maşına ötürülmür və kimsə onun vaxtını oğurladığına inanır (məsələn, 2 GHz tələb etdi, lakin bunun yarısını aldı).

Ümumiyyətlə, təhrifin bir çox səbəbi ola bilər. Müəyyən bir sistemdə başqa bir şey tapa bilərsiniz. Yuxarıda link verdiyim kitablardan başlamaq və hipervizordan perf, sysdig, systemtap kimi utilitlərdən istifadə etməklə statistika əldə etmək daha yaxşıdır. onlarla.

5. Nəticələr

  1. Paravirtuallaşmaya görə müəyyən miqdarda oğurluq baş verə bilər və bunu normal hesab etmək olar. İnternetdə yazırlar ki, bu dəyər 5-10% ola bilər. Virtual maşın daxilindəki proqramlardan və onun fiziki cihazlarına qoyduğu yükdən asılıdır. Burada tətbiqlərin virtual maşınlar içərisində necə hiss etdiyinə diqqət yetirmək vacibdir.
  2. Hipervisordakı yükün və virtual maşının içərisindəki oğurluğun nisbəti həmişə bir-biri ilə aydın şəkildə əlaqəli deyil; oğurluğun hər iki təxminləri müxtəlif yüklər altında xüsusi vəziyyətlərdə səhv ola bilər.
  3. Planlayıcının çox şey tələb edən proseslərə münasibəti pisdir. Çox istəyənə az verməyə çalışır. Böyük virtual maşınlar pisdir.
  4. Bir az oğurluq hətta paravirtuallaşdırma olmadan da norma ola bilər (virtual maşının içərisindəki yükü, qonşuların yükünün xüsusiyyətlərini, yükün iplər üzrə paylanması və digər amilləri nəzərə alaraq).
  5. Müəyyən bir sistemdə oğurluğu anlamaq istəyirsinizsə, müxtəlif variantları araşdırmalı, ölçüləri toplamalı, diqqətlə təhlil etməli və yükü necə bərabər paylayacağınızı düşünməlisiniz. İstənilən hallardan sapmalar mümkündür, bunlar eksperimental olaraq təsdiq edilməli və ya kernel debugger-də nəzərdən keçirilməlidir.

Mənbə: www.habr.com

Добавить комментарий