kinerja aplikasi jaringan Linux. Pambuka

Aplikasi web saiki digunakake ing endi wae, lan ing antarane kabeh protokol transportasi, HTTP ngenggoni bagean sing paling gedhe. Nalika nyinaoni nuansa pangembangan aplikasi web, umume wong ora menehi perhatian marang sistem operasi ing ngendi aplikasi kasebut bener-bener mlaku. Pemisahan pembangunan (Dev) lan operasi (Ops) mung nggawe kahanan luwih elek. Nanging kanthi mundhake budaya DevOps, pangembang dadi tanggung jawab kanggo mbukak aplikasi ing méga, saéngga migunani banget kanggo wong-wong mau dadi akrab karo mburi sistem operasi. Iki utamané migunani yen sampeyan nyoba kanggo masang sistem kanggo ewu utawa puluhan ewu sambungan simultaneous.

Watesan ing layanan web meh padha karo sing ana ing aplikasi liyane. Apa iku load balancers utawa server database, kabeh aplikasi iki duwe masalah padha ing lingkungan kinerja dhuwur. Ngerteni watesan dhasar kasebut lan cara ngatasi kanthi umum bakal mbantu sampeyan ngevaluasi kinerja lan skalabilitas aplikasi web sampeyan.

Aku nulis seri artikel iki kanggo nanggepi pitakonan saka pangembang enom sing pengin dadi arsitek sistem sing ngerti. Ora mungkin ngerti kanthi jelas teknik optimasi aplikasi Linux tanpa nyilem dhasar babagan cara kerjane ing tingkat sistem operasi. Sanajan ana akeh jinis aplikasi, ing seri iki aku pengin njelajah aplikasi basis web tinimbang aplikasi desktop kayata browser utawa editor teks. Materi iki ditujokake kanggo pangembang lan arsitek sing pengin ngerti cara kerja program Linux utawa Unix lan carane nggawe struktur kanggo kinerja dhuwur.

Linux iku kamar server sistem operasi, lan paling asring aplikasi sampeyan mbukak ing OS iki. Senajan aku ngomong "Linux", paling wektu sampeyan bisa kanthi aman nganggep kabeh sistem operasi kaya Unix ing umum. Nanging, aku durung nyoba kode sing ana ing sistem liyane. Dadi, yen sampeyan kasengsem ing FreeBSD utawa OpenBSD, asil sampeyan bisa beda-beda. Nalika aku nyoba soko Linux-tartamtu, Aku nuduhake.

Nalika sampeyan bisa nggunakake kawruh iki kanggo mbangun app saka ngeruk lan bakal sampurna optimized, iku paling apik ora kanggo nindakake iku. Yen sampeyan nulis server web anyar ing C utawa C ++ kanggo aplikasi bisnis organisasi sampeyan, iki bisa uga dina pungkasan sampeyan kerja. Nanging, ngerti struktur aplikasi kasebut bakal mbantu milih program sing wis ana. Sampeyan bakal bisa mbandhingake sistem basis proses karo sistem basis thread uga basis acara. Sampeyan bakal ngerti lan ngurmati kenapa Nginx nindakake luwih apik tinimbang Apache httpd, kenapa aplikasi Python adhedhasar Tornado bisa nglayani luwih akeh pangguna dibandhingake karo aplikasi Python adhedhasar Django.

ZeroHTTPd: Alat Pembelajaran

ZeroHTTPd minangka server web sing daktulis saka awal ing C minangka alat pamulangan. Ora ana dependensi eksternal, kalebu akses menyang Redis. Kita mbukak prosedur Redis dhewe. Deleng ing ngisor iki kanggo rincian liyane.

Sanajan kita bisa ngrembug teori kanthi dawa, ora ana sing luwih apik tinimbang nulis kode, mbukak, lan mbandhingake kabeh arsitektur server. Iki minangka cara sing paling jelas. Mulane, kita bakal nulis server web ZeroHTTPd sing prasaja nggunakake saben model: basis proses, basis thread, lan basis acara. Ayo priksa saben server kasebut lan deleng kepiye kinerja dibandhingake saben liyane. ZeroHTTPd dileksanakake ing file siji C. Server basis acara kalebu uthash, implementasi tabel hash gedhe sing kasedhiya ing file header siji. Ing kasus liyane, ora ana dependensi, supaya ora nggawe rumit proyek kasebut.

Ana akeh komentar ing kode kanggo mbantu sampeyan ngerti. Dadi server web sing prasaja ing sawetara baris kode, ZeroHTTPd uga minangka kerangka minimal kanggo pangembangan web. Nduwe fungsi sing winates, nanging bisa ngladeni file statis lan kaca "dinamis" sing gampang banget. Aku kudu ujar manawa ZeroHTTPd apik kanggo sinau babagan nggawe aplikasi Linux kanthi kinerja dhuwur. Umumé, umume layanan web ngenteni panjaluk, mriksa lan ngolah. Iki persis apa sing bakal ditindakake ZeroHTTPd. Iki minangka alat kanggo sinau, dudu produksi. Ora apik kanggo nangani kesalahan lan ora bisa gumunggung praktik keamanan paling apik (oh ya, aku biyen strcpy) utawa trik pinter basa C. Nanging muga-muga bisa ditindakake kanthi becik.

kinerja aplikasi jaringan Linux. Pambuka
Kaca ngarep ZeroHTTPd. Bisa ngasilake macem-macem jinis file kalebu gambar

Aplikasi Buku Tamu

Aplikasi web modern biasane ora winates ing file statis. Dheweke duwe interaksi kompleks karo macem-macem database, cache, lan liya-liyane. Dadi, kita bakal nggawe aplikasi web prasaja sing diarani "Buku Tamu" ing ngendi pengunjung ninggalake entri miturut jenenge. Buku tamu nyimpen entri sing ditinggal sadurunge. Ana uga counter pengunjung ing sisih ngisor kaca.

kinerja aplikasi jaringan Linux. Pambuka
Aplikasi web "Buku Tamu" ZeroHTTPd

Counter pengunjung lan entri buku tamu disimpen ing Redis. Kanggo komunikasi karo Redis, prosedur dhewe ditindakake, ora gumantung ing perpustakaan eksternal. Aku dudu penggemar gedhe babagan nggulung kode homebrew nalika ana solusi sing kasedhiya lan diuji kanthi apik. Nanging tujuan ZeroHTTPd yaiku sinau kinerja Linux lan akses menyang layanan eksternal, nalika nglayani panjaluk HTTP duwe pengaruh kinerja sing serius. Kita kudu ngontrol komunikasi karo Redis ing saben arsitektur server kita. Ing sawetara arsitektur kita nggunakake pamblokiran telpon, ing liyane kita nggunakake prosedur adhedhasar acara. Nggunakake perpustakaan klien Redis eksternal ora bakal menehi kontrol iki. Kajaba iku, klien Redis cilik kita mung nindakake sawetara fungsi (njupuk, nyetel, lan nambah kunci; njupuk lan nambahake array). Kajaba iku, protokol Redis banget elegan lan prasaja. Sampeyan malah ora perlu khusus mulang. Kasunyatan bilih protokol nindakake kabeh karya ing babagan satus baris kode nuduhake carane uga panginten metu iku.

Tokoh ing ngisor iki nuduhake apa sing ditindakake aplikasi nalika klien (browser) njaluk /guestbookURL.

kinerja aplikasi jaringan Linux. Pambuka
Cara kerja aplikasi buku tamu

Nalika kaca buku tamu kudu ditanggepi, ana siji telpon menyang sistem file kanggo maca cithakan menyang memori lan telung telpon jaringan kanggo Redis. File template ngemot sebagian besar konten HTML kanggo kaca ing gambar ing ndhuwur. Ana uga placeholder khusus kanggo bagean dinamis isi: kiriman lan counter pengunjung. Kita nampa saka Redis, lebokake menyang kaca lan nyedhiyakake klien kanthi isi sing wis rampung. Telpon katelu kanggo Redis bisa nyingkiri amarga Redis ngasilake nilai kunci anyar nalika ditambah. Nanging, kanggo server kita, sing nduweni arsitektur adhedhasar acara sing ora sinkron, akeh panggilan jaringan minangka tes sing apik kanggo tujuan sinau. Dadi kita mbuwang nilai bali Redis saka jumlah pengunjung lan takon karo telpon sing kapisah.

Arsitektur server ZeroHTTPd

Kita mbangun pitung versi ZeroHTTPd kanthi fungsi sing padha nanging arsitektur beda:

  • Iteratif
  • Server garpu (siji proses anak saben panyuwunan)
  • Server pra-fork (pra-forking proses)
  • Server kanthi utas eksekusi (siji utas saben panyuwunan)
  • Server kanthi nggawe pre-thread
  • Arsitektur adhedhasar poll()
  • Arsitektur adhedhasar epoll

Kita ngukur kinerja saben arsitektur kanthi ngemot server kanthi panjaluk HTTP. Nanging nalika mbandhingake arsitektur banget paralel, jumlah pitakon mundhak. Kita nguji kaping telu lan ngitung rata-rata.

Metodologi tes

kinerja aplikasi jaringan Linux. Pambuka
ZeroHTTPd load testing persiyapan

Penting yen nalika nindakake tes, kabeh komponen ora mlaku ing mesin sing padha. Ing kasus iki, OS mbutuhake overhead jadwal tambahan amarga komponen bersaing kanggo CPU. Ngukur overhead sistem operasi saben arsitektur server sing dipilih minangka salah sawijining tujuan sing paling penting ing latihan iki. Nambahake variabel liyane bakal ngrusak proses kasebut. Mulane, setelan ing gambar ing ndhuwur paling apik.

Apa sing ditindakake saben server kasebut?

  • load.unixism.net: Iki ngendi kita mbukak ab, utilitas Apache Benchmark. Iki ngasilake beban sing dibutuhake kanggo nyoba arsitektur server kita.
  • nginx.unixism.net: Kadhangkala kita pengin mbukak luwih saka siji conto program server. Kanggo nindakake iki, server Nginx kanthi setelan sing cocog bisa digunakake minangka penyeimbang beban ab menyang proses server kita.
  • zerohttpd.unixism.net: Ing kene kita mbukak program server ing pitung arsitektur sing beda-beda, siji-sijine.
  • redis.unixism.net: Server iki nganggo daemon Redis, ing ngendi entri buku tamu lan counter pengunjung disimpen.

Kabeh server mbukak ing inti prosesor padha. Ide iki kanggo ngevaluasi kinerja maksimal saben arsitektur. Wiwit kabeh program server dites ing hardware sing padha, iki minangka garis dasar kanggo mbandhingake. Persiyapan tesku kalebu server virtual sing disewa saka Digital Ocean.

Apa sing kita ukur?

Sampeyan bisa ngukur indikator sing beda. Kita ngevaluasi kinerja saben arsitektur ing konfigurasi tartamtu kanthi ngemot server kanthi panjaluk ing tingkat paralelisme sing beda: beban mundhak saka 20 nganti 15 pangguna bebarengan.

Asil tes

Bagan ing ngisor iki nuduhake kinerja server ing arsitektur sing beda-beda ing tingkat paralelisme sing beda. Sumbu y minangka jumlah panjalukan per detik, sumbu x minangka sambungan paralel.

kinerja aplikasi jaringan Linux. Pambuka

kinerja aplikasi jaringan Linux. Pambuka

kinerja aplikasi jaringan Linux. Pambuka

Ing ngisor iki ana tabel kanthi asil.

panjalukan saben detik

paralelisme
iteratif
garpu
pra-garpu
streaming
pra-streaming
jajak pendapat
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
panyebaran gedhe
2138

5000
-
panyebaran gedhe
1600
1100
2519
-
2235

8000
-
-
1200
panyebaran gedhe
2451
-
2100

10
-
-
panyebaran gedhe
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Saka grafik lan tabel bisa dideleng yen ing ndhuwur 8000 panjalukan simultaneous kita mung duwe rong pemain: pre-garpu lan epoll. Nalika beban mundhak, server basis polling nindakake luwih elek tinimbang streaming. Arsitektur thread-pre-creation minangka saingan sing pantes kanggo epoll, bukti carane kernel Linux nggawe jadwal akeh thread.

Kode Sumber ZeroHTTPd

Kode Sumber ZeroHTTPd kene. Ana direktori kapisah kanggo saben arsitektur.

ZeroHTTPd │ ├── 01_iteratif │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking ─ ─ ─ ─ ─ ─ ─ . threading │ ├── main.c ├── 04_prethreading │ ├── main.c ├── 05_poll │ ├── main.c ├── 06_epoll │ └── Make.c ─ ─ utama ├── indeks .html │ └── tux png └── cithakan └── buku tamu └── index.html

Saliyane pitung direktori kanggo kabeh arsitektur, ana loro liyane ing direktori tingkat paling dhuwur: umum lan cithakan. Pisanan ngemot file index.html lan gambar saka gambar pisanan. Sampeyan bisa nyelehake file lan folder liyane ing kana, lan ZeroHTTPd kudu ngladeni file statis kasebut tanpa masalah. Yen path ing browser cocog path ing folder umum, banjur ZeroHTTPd nggoleki file index.html ing direktori iki. Isi kanggo buku tamu digawe kanthi dinamis. Iku mung nduweni kaca ngarep, lan isine adhedhasar file 'templates/guestbook/index.html'. ZeroHTTPd gampang nambah kaca dinamis kanggo extension. Ide iki yaiku pangguna bisa nambah template menyang direktori iki lan ngluwihi ZeroHTTPd yen perlu.

Kanggo mbangun kabeh pitung server, mbukak make all saka direktori tingkat paling dhuwur - lan kabeh mbangun bakal katon ing direktori iki. File eksekusi nggoleki direktori umum lan template ing direktori sing diluncurake.

API Linux

Sampeyan ora perlu ngerti babagan API Linux kanggo mangerteni informasi ing seri artikel iki. Nanging, aku nyaranake maca liyane babagan topik iki; ana akeh sumber referensi ing Internet. Sanajan kita bakal ndemek sawetara kategori API Linux, fokus kita utamane ing proses, utas, acara, lan tumpukan jaringan. Saliyane buku lan artikel babagan API Linux, aku uga nyaranake maca mana kanggo telpon sistem lan fungsi perpustakaan sing digunakake.

Kinerja lan Skalabilitas

Siji cathetan babagan kinerja lan skalabilitas. Secara teoritis, ora ana hubungane antarane dheweke. Sampeyan bisa duwe layanan web sing bisa dianggo kanthi apik, kanthi wektu nanggepi sawetara milidetik, nanging ora ukurane. Semono uga, bisa uga ana aplikasi web sing kinerjane ora apik sing butuh sawetara detik kanggo nanggapi, nanging timbangan kanthi puluhan kanggo nangani puluhan ewu pangguna bebarengan. Nanging, kombinasi kinerja dhuwur lan skalabilitas minangka kombinasi sing kuat banget. Aplikasi kanthi kinerja dhuwur umume nggunakake sumber daya kanthi sithik lan kanthi efisien nglayani pangguna sing luwih akeh bebarengan ing server, nyuda biaya.

CPU lan I / O tugas

Pungkasan, ing komputasi mesthi ana rong jinis tugas: kanggo I / O lan CPU. Nampa panjalukan liwat Internet (jaringan I / O), porsi file (jaringan lan disk I / O), sesambungan karo database (jaringan lan disk I / O) kabeh I / O aktivitas. Sawetara pitakon basis data bisa dadi rada intensif CPU (ngurutake, rata-rata asil sejuta, lsp). Paling aplikasi web diwatesi dening maksimum bisa I / O, lan prosesor arang digunakake ing kapasitas lengkap. Nalika sampeyan ndeleng sing sawetara I / O tugas nggunakake akèh CPU, iku paling kamungkinan tandha arsitektur aplikasi miskin. Iki bisa ateges manawa sumber daya CPU boroske ing manajemen proses lan ngoper konteks - lan iki ora kabeh migunani. Yen sampeyan nindakake kaya pangolahan gambar, konversi file audio, utawa sinau mesin, mula aplikasi kasebut mbutuhake sumber daya CPU sing kuat. Nanging kanggo umume aplikasi iki ora kedadeyan.

Sinau luwih lengkap babagan arsitektur server

  1. Bagian I: Arsitektur Iteratif
  2. Bagean II. Server garpu
  3. Bab III. Server pra-garpu
  4. Bab IV. Server kanthi utas eksekusi
  5. Part V. Server pra-Utas
  6. BAB VI. arsitektur basis Pol
  7. Bab VII. arsitektur adhedhasar epoll

Source: www.habr.com

Add a comment