Kinerja aplikasi jaringan Linux. Bubuka

Aplikasi wéb ayeuna dianggo di mana waé, sareng diantara sadaya protokol angkutan, HTTP nyertakeun bagian singa. Nalika ngulik nuansa pamekaran aplikasi wéb, kalolobaan jalma henteu nengetan pisan kana sistem operasi dimana aplikasi ieu leres-leres dijalankeun. Pemisahan pangwangunan (Dev) sareng operasi (Ops) ngan ukur ngajantenkeun kaayaan langkung parah. Tapi kalayan naékna budaya DevOps, pamekar janten tanggung jawab pikeun ngajalankeun aplikasina dina méga, janten mangpaat pisan pikeun aranjeunna janten akrab pisan sareng backend sistem operasi. Ieu hususna kapaké upami anjeun nyobian nyebarkeun sistem pikeun rébuan atanapi puluhan rébu sambungan sakaligus.

Watesan dina ladenan wéb sami pisan sareng anu aya dina aplikasi anu sanés. Naha éta pangimbang beban atanapi pangladén databés, sadaya aplikasi ieu ngagaduhan masalah anu sami dina lingkungan kinerja tinggi. Ngartos watesan dasar ieu sareng kumaha cara nungkulanana sacara umum bakal ngabantosan anjeun ngevaluasi kinerja sareng skalabilitas aplikasi wéb anjeun.

Abdi nyerat séri tulisan ieu pikeun ngaréspon patarosan ti pamekar ngora anu hoyong janten arsiték sistem anu terang. Teu mungkin ngartos sacara jelas téknik optimasi aplikasi Linux tanpa nyilem kana dasar-dasar kumaha aranjeunna tiasa dianggo dina tingkat sistem operasi. Sanaos aya seueur jinis aplikasi, dina séri ieu kuring hoyong ngajalajah aplikasi basis wéb tinimbang aplikasi desktop sapertos browser atanapi pangropéa téksu. Bahan ieu ditujukeun pikeun pamekar sareng arsiték anu hoyong ngartos kumaha program Linux atanapi Unix jalanna sareng kumaha nyusunna pikeun pagelaran anu luhur.

Linux nyaéta kamar server sistem operasi, sarta paling sering aplikasi Anjeun ngajalankeun on OS ieu. Sanajan kuring nyebutkeun "Linux", lolobana waktu anjeun aman bisa nganggap yen abdi hartosna sadaya sistem operasi Unix-kawas sacara umum. Nanging, kuring henteu acan nguji kodeu anu aya dina sistem anu sanés. Janten, upami anjeun resep kana FreeBSD atanapi OpenBSD, hasil anjeun tiasa bénten-béda. Nalika kuring nyobian hal anu khusus Linux, kuring nunjukkeun éta.

Sanaos anjeun tiasa nganggo pangaweruh ieu pikeun ngawangun aplikasi ti mimiti sareng éta bakal dioptimalkeun sampurna, langkung saé henteu ngalakukeun éta. Upami anjeun nyerat pangladén wéb énggal dina C atanapi C ++ pikeun aplikasi bisnis organisasi anjeun, ieu tiasa janten dinten terakhir anjeun dina padamelan. Nanging, terang struktur aplikasi ieu bakal ngabantosan dina milih program anu tos aya. Anjeun bakal tiasa ngabandingkeun sistem dumasar-prosés sareng sistem dumasar-thread ogé dumasar-kajadian. Anjeun bakal ngartos sareng ngahargaan naha Nginx langkung saé tibatan Apache httpd, naha aplikasi Python dumasar Tornado tiasa langkung seueur pangguna dibandingkeun sareng aplikasi Python dumasar Django.

ZeroHTTPd: Alat Diajar

ZeroHTTPd mangrupakeun web server anu kuring nulis ti scratch dina C salaku alat pangajaran. Henteu aya katergantungan éksternal, kalebet aksés ka Redis. Urang ngajalankeun prosedur Redis urang sorangan. Tempo di handap pikeun leuwih rinci.

Sanaos urang tiasa ngabahas téori sacara panjang, teu aya anu langkung saé tibatan nyerat kode, ngajalankeunana, sareng ngabandingkeun sadaya arsitéktur server. Ieu métode paling atra. Ku alatan éta, urang bakal nulis web server ZeroHTTPd basajan ngagunakeun unggal model: dumasar-prosés, thread-based, sarta acara-based. Hayu urang parios masing-masing server ieu sareng tingali kumaha kinerjana dibandingkeun saling. ZeroHTTPd dilaksanakeun dina file C tunggal. The server dumasar-acara ngawengku uthash, palaksanaan tabel Hash hébat nu asalna dina file lulugu tunggal. Dina kasus anu sanés, henteu aya katergantungan, supados henteu ngahesekeun proyék.

Aya seueur koméntar dina kodeu pikeun ngabantosan anjeun ngartos. Salaku pangladén wéb anu sederhana dina sababaraha baris kode, ZeroHTTPd ogé mangrupikeun kerangka minimal pikeun pangwangunan wéb. Éta ngagaduhan pungsionalitas kawates, tapi sanggup ngalayanan file statik sareng halaman "dinamis" anu saderhana pisan. Kuring kedah nyarios yén ZeroHTTPd saé pikeun diajar kumaha cara nyiptakeun aplikasi Linux berkinerja tinggi. Sacara umum, kalolobaan ladenan wéb ngadagoan pamundut, pariksa sareng ngolahna. Ieu persis naon ZeroHTTPd bakal ngalakukeun. Ieu mangrupikeun alat pikeun diajar, sanés produksi. Éta henteu saé dina nanganan kasalahan sareng sigana moal ngagungkeun prakték kaamanan anu pangsaéna (oh hehehehe, kuring biasa strcpy) atawa trik pinter basa C. Tapi kuring miharep éta karyana ogé.

Kinerja aplikasi jaringan Linux. Bubuka
Kaca imah ZeroHTTPd. Bisa kaluaran tipe file béda kaasup gambar

Aplikasi Buku Tamu

Aplikasi wéb modern biasana henteu dugi ka file statik. Aranjeunna mibanda interaksi kompléks jeung sagala rupa basis data, caches, jsb Ku kituna urang bakal nyieun hiji aplikasi wéb basajan disebut "Buku Tamu" dimana datang ninggalkeun entri dina ngaran maranéhanana. The toko buku tamu éntri ditinggalkeun saméméhna. Aya ogé lokét sémah di handapeun halaman.

Kinerja aplikasi jaringan Linux. Bubuka
Aplikasi wéb "Buku Tamu" ZeroHTTPd

Counter tamu sareng éntri buku tamu disimpen di Redis. Pikeun komunikasi sareng Redis, prosedur sorangan dilaksanakeun; aranjeunna henteu gumantung kana perpustakaan éksternal. Abdi lain kipas badag rolling kaluar kode homebrew lamun aya publik sadia tur well-dites solusi. Tapi tujuan ZeroHTTPd nyaéta pikeun ngulik kinerja Linux sareng aksés ka jasa éksternal, bari ngalayanan pamundut HTTP gaduh dampak kinerja anu serius. Urang kedah pinuh ngadalikeun komunikasi sareng Redis dina unggal arsitéktur server urang. Dina sababaraha arsitéktur kami nganggo blocking sauran, di batur kami nganggo prosedur dumasar-kajadian. Ngagunakeun perpustakaan klien Redis éksternal moal nyadiakeun kadali ieu. Salaku tambahan, klien Redis sakedik kami ngan ukur ngalaksanakeun sababaraha fungsi (meunang, netepkeun, sareng ningkatkeun konci; kéngingkeun sareng nambihan kana susunan). Salaku tambahan, protokol Redis pisan elegan sareng saderhana. Anjeun malah teu kedah husus ngajarkeun eta. Kanyataan yén protokol ngalakukeun sadaya padamelan dina sakitar saratus garis kode nunjukkeun kumaha panginten éta.

Gambar di handap ieu nunjukkeun naon anu dilakukeun ku aplikasi nalika pamundut klien (browser). /guestbookURL.

Kinerja aplikasi jaringan Linux. Bubuka
Kumaha aplikasi buku tamu jalan

Nalika halaman buku tamu kedah dikaluarkeun, aya hiji telepon ka sistem file pikeun maca template kana mémori sareng tilu telepon jaringan ka Redis. File citakan ngandung sabagéan ageung eusi HTML pikeun kaca dina screenshot di luhur. Aya ogé pananda tempat khusus pikeun bagian dinamis tina eusi: tulisan sareng counter pengunjung. Kami nampi aranjeunna ti Redis, selapkeun kana halaman sareng nyayogikeun klien eusi anu pinuh kabentuk. Telepon katilu ka Redis tiasa dihindari sabab Redis ngabalikeun nilai konci énggal nalika naék. Nanging, pikeun server kami, anu gaduh arsitéktur dumasar-kajadian anu teu sinkron, seueur telepon jaringan mangrupikeun tés anu saé pikeun tujuan diajar. Janten urang miceun nilai balik Redis tina jumlah sémah sareng naroskeun ku telepon anu misah.

Arsitéktur server ZeroHTTPd

Kami ngawangun tujuh vérsi ZeroHTTPd kalayan fungsionalitas anu sami tapi arsitéktur anu béda:

  • Iteratif
  • Server garpu (hiji prosés anak per pamundut)
  • Server pra-garpu (pra-forking prosés)
  • Server sareng utas palaksanaan (hiji utas per pamundut)
  • Server kalawan kreasi pre-thread
  • Arsitéktur dumasar poll()
  • Arsitéktur dumasar epoll

Urang ngukur kinerja unggal arsitéktur ku loading server kalawan requests HTTP. Tapi lamun ngabandingkeun arsitéktur kacida paralel, jumlah queries naek. Kami nguji tilu kali sareng ngitung rata-rata.

Métodologi tés

Kinerja aplikasi jaringan Linux. Bubuka
ZeroHTTPd nguji beban setup

Kadé nalika ngajalankeun tés, sadaya komponén henteu ngajalankeun dina mesin anu sami. Dina hal ieu, OS nanggung overhead scheduling tambahan salaku komponén bersaing pikeun CPU. Ngukur overhead sistem operasi unggal arsitéktur server anu dipilih mangrupikeun salah sahiji tujuan anu paling penting dina latihan ieu. Nambahkeun deui variabel bakal ngarugikeun prosés. Ku alatan éta, setelan dina gambar di luhur jalan pangalusna.

Naon anu dilakukeun ku unggal server ieu?

  • load.unixism.net: Ieu dimana urang ngajalankeun ab, Utiliti Patokan Apache. Éta ngahasilkeun beban anu diperyogikeun pikeun nguji arsitéktur server kami.
  • nginx.unixism.net: Kadang urang hoyong ngajalankeun leuwih ti hiji conto program server. Jang ngalampahkeun ieu, pangladén Nginx sareng setélan anu cocog tiasa dianggo salaku pangimbang beban ab kana prosés server kami.
  • zerohttpd.unixism.net: Di dieu urang ngajalankeun program server dina tujuh arsitéktur béda, hiji-hiji.
  • redis.unixism.net: server ieu ngajalankeun daemon Redis, dimana entri buku tamu jeung counters datang disimpen.

Sadaya server dijalankeun dina inti prosesor anu sami. Ide pikeun evaluate kinerja maksimum unggal arsitéktur. Kusabab sadaya program server diuji dina hardware anu sami, ieu mangrupikeun dasar pikeun ngabandingkeun. Setélan tés kuring diwangun ku server virtual anu disewa ti Digital Ocean.

Naon anu urang ukur?

Anjeun tiasa ngukur indikator anu béda. Urang evaluate kinerja unggal arsitéktur dina konfigurasi tinangtu ku ngamuat server kalawan requests dina tingkat paralelisme béda: beban tumuwuh tina 20 nepi ka 15 pamaké babarengan.

Hasil tés

Bagan di handap ieu nunjukkeun kinerja server dina arsitéktur anu béda dina tingkat paralélisme anu béda. Sumbu-y nyaéta jumlah paménta per detik, sumbu-x nyaéta sambungan paralel.

Kinerja aplikasi jaringan Linux. Bubuka

Kinerja aplikasi jaringan Linux. Bubuka

Kinerja aplikasi jaringan Linux. Bubuka

Di handap ieu tabel kalawan hasil.

requests per detik

paralelisme
iteratif
garpu
pre-garpu
streaming
pre-streaming
mere sora
epoll

20
7
112
2100
1800
2250
1900
2050

50
7
190
2200
1700
2200
2000
2000

100
7
245
2200
1700
2200
2150
2100

200
7
330
2300
1750
2300
2200
2100

300
-
380
2200
1800
2400
2250
2150

400
-
410
2200
1750
2600
2000
2000

500
-
440
2300
1850
2700
1900
2212

600
-
460
2400
1800
2500
1700
2519

700
-
460
2400
1600
2490
1550
2607

800
-
460
2400
1600
2540
1400
2553

900
-
460
2300
1600
2472
1200
2567

1000
-
475
2300
1700
2485
1150
2439

1500
-
490
2400
1550
2620
900
2479

2000
-
350
2400
1400
2396
550
2200

2500
-
280
2100
1300
2453
490
2262

3000
-
280
1900
1250
2502
sumebar badag
2138

5000
-
sumebar badag
1600
1100
2519
-
2235

8000
-
-
1200
sumebar badag
2451
-
2100

10
-
-
sumebar badag
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Ti grafik na tabel bisa ditempo yén di luhur 8000 requests simultaneous kami boga ukur dua pamaén ditinggalkeun: pre-garpu na epoll. Nalika beban naék, server dumasar polling langkung parah tibatan anu streaming. Arsitéktur thread-pre-creation mangrupakeun saingan pantes pikeun epoll, hiji bukti kumaha ogé kernel Linux Ubuntu ngajadwalkeun jumlah badag threads.

Kode Sumber ZeroHTTPd

Kode Sumber ZeroHTTPd di dieu. Aya diréktori misah pikeun tiap arsitéktur.

ZeroHTTPd │ ├── 01_iterative │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking ─ ─ ─ ─ ─ ─ ─ . threading │ ├── main.c ├── 04_prethreading │ ├── main.c ├── 05_poll │ ├── main.c ├── 06_epoll │ └── └── Main.c ─ ├ file publik ├── indéks .html │ └── tux png └── template └── buku tamu └── index.html

Salian tujuh diréktori pikeun sadaya arsitéktur, aya dua deui dina diréktori tingkat luhur: umum sareng témplat. Kahiji ngandung file index.html jeung gambar ti screenshot munggaran. Anjeun tiasa nempatkeun file sareng polder sanés di dinya, sareng ZeroHTTPd kedah ngalayanan file statik éta tanpa aya masalah. Upami jalur dina browser cocog sareng jalur dina folder umum, ZeroHTTPd milarian file index.html dina diréktori ieu. Eusi pikeun buku tamu dihasilkeun dinamis. Éta ngan ukur gaduh halaman bumi, sareng eusina dumasar kana file 'templates/guestbook/index.html'. ZeroHTTPd gampang nambihan halaman dinamis pikeun ekstensi. Idena nyaéta yén pangguna tiasa nambihan témplat kana diréktori ieu sareng manjangkeun ZeroHTTPd upami diperyogikeun.

Pikeun ngawangun sadaya tujuh server, jalankeun make all ti diréktori tingkat luhur - sareng sadaya wangunan bakal muncul dina diréktori ieu. File anu tiasa dieksekusi milarian diréktori umum sareng témplat dina diréktori dimana aranjeunna diluncurkeun.

API Linux

Anjeun teu kedah versed ogé dina API Linux Ubuntu ngartos informasi dina runtuyan artikel ieu. Nanging, kuring nyarankeun maca langkung seueur ngeunaan topik ieu; aya seueur sumber rujukan dina Internét. Sanaos urang bakal nyabak sababaraha kategori API Linux, fokus urang utamina dina prosés, utas, acara, sareng tumpukan jaringan. Salian buku jeung artikel ngeunaan API Linux Ubuntu, Kuring ogé nyarankeun maca mana pikeun nelepon sistem jeung fungsi perpustakaan dipaké.

Performance sarta Scalability

Hiji catetan ngeunaan kinerja sarta scalability. Sacara téoritis, teu aya hubunganana antara aranjeunna. Anjeun tiasa gaduh jasa wéb anu tiasa dianggo saé pisan, kalayan waktos réspon sababaraha milidetik, tapi éta henteu skala pisan. Kitu ogé, meureun aya aplikasi wéb anu kirang ngajalankeun anu peryogi sababaraha detik kanggo ngaréspon, tapi skalana ku puluhan pikeun nanganan puluhan rébu pangguna sakaligus. Sanajan kitu, kombinasi kinerja tinggi na scalability mangrupakeun kombinasi pisan kuat. Aplikasi-kinerja tinggi umumna ngagunakeun sumberdaya sparingly sahingga éfisién ngalayanan pamaké leuwih babarengan dina server, ngurangan biaya.

CPU jeung I / O tugas

Tungtungna, dina komputasi sok aya dua jenis tugas mungkin: pikeun I / O jeung CPU. Narima requests ngaliwatan Internet (jaringan I / O), porsi file (jaringan sarta disk I / O), komunikasi jeung database (jaringan sarta disk I / O) nyaéta sakabéh I / O kagiatan. Sababaraha queries database tiasa bit CPU intensif (asihan, rata-rata sajuta hasil, jsb). Paling aplikasi wéb diwatesan ku maksimum mungkin I / O, sarta processor jarang dipaké dina kapasitas pinuh. Lamun anjeun nempo yén sababaraha I / O tugas ngagunakeun loba CPU, éta paling dipikaresep tanda arsitektur aplikasi goréng. Ieu tiasa hartosna yén sumber daya CPU dibuang dina manajemén prosés sareng gentos kontéks - sareng ieu henteu mangpaat pisan. Upami anjeun ngalakukeun hal sapertos ngolah gambar, konvérsi file audio, atanapi diajar mesin, maka aplikasina peryogi sumber daya CPU anu kuat. Tapi pikeun sabagéan ageung aplikasi ieu sanés masalahna.

Diajar langkung seueur ngeunaan arsitéktur server

  1. Bagian I: Arsitéktur Iteratif
  2. Bagian II. server garpu
  3. Bagian III. Server pra-garpu
  4. Bagian IV. Server kalawan threads palaksanaan
  5. Bagian V. server pre-threaded
  6. Bagian VI. Arsitéktur basis Pol
  7. Bagian VII. arsitéktur basis epoll

sumber: www.habr.com

Tambahkeun komentar