Pagganap sa Aplikasyon sa Linux Network. Pasiuna

Ang mga aplikasyon sa web gigamit na karon bisan asa, ug taliwala sa tanan nga mga protocol sa transportasyon, ang HTTP nag-okupar sa bahin sa leon. Kung gitun-an ang mga nuances sa pag-uswag sa aplikasyon sa web, kadaghanan sa mga tawo wala kaayo magtagad sa operating system diin kini nga mga aplikasyon nagdagan. Ang separation of development (Dev) ug operations (Ops) nagpasamot lang sa sitwasyon. Apan sa pagsaka sa kultura sa DevOps, ang mga developer nahimong responsable sa pagpadagan sa ilang mga aplikasyon sa panganod, mao nga mapuslanon kaayo alang kanila nga mahimong hingpit nga pamilyar sa backend sa operating system. Kini labi ka mapuslanon kung ikaw naningkamot sa pag-deploy sa usa ka sistema alang sa liboan o napulo ka libo nga dungan nga mga koneksyon.

Ang mga limitasyon sa mga serbisyo sa web parehas kaayo sa sa ubang mga aplikasyon. Bisan kung kini mga load balancer o database server, kining tanan nga mga aplikasyon adunay parehas nga mga problema sa usa ka high-performance nga palibot. Ang pagsabut niining sukaranan nga mga limitasyon ug kung unsaon pagbuntog niini sa kinatibuk-an makatabang kanimo sa pagtimbang-timbang sa performance ug scalability sa imong mga web application.

Gisulat ko kini nga serye sa mga artikulo agig tubag sa mga pangutana gikan sa mga batan-ong developer nga gusto nga mahimong mga arkitekto sa sistema nga adunay kahibalo. Imposible nga tin-aw nga masabtan ang mga pamaagi sa pag-optimize sa aplikasyon sa Linux nga wala mag-dive sa mga sukaranan kung giunsa kini nagtrabaho sa lebel sa operating system. Bisan kung adunay daghang mga klase sa aplikasyon, sa kini nga serye gusto nako nga usisahon ang mga aplikasyon nga nakabase sa web kaysa mga aplikasyon sa desktop sama sa browser o editor sa teksto. Kini nga materyal gituyo alang sa mga developer ug arkitekto nga gusto nga masabtan kung giunsa ang mga programa sa Linux o Unix ug kung giunsa kini pag-istruktura alang sa taas nga pasundayag.

Ang Linux mao lawak sa server operating system, ug kasagaran ang imong mga aplikasyon nagdagan niini nga OS. Bisan kung giingon nako ang "Linux", kadaghanan sa mga oras mahimo nimong luwas nga hunahunaon nga gipasabut nako ang tanan nga mga operating system nga sama sa Unix sa kinatibuk-an. Bisan pa, wala nako gisulayan ang kauban nga code sa ubang mga sistema. Busa, kung interesado ka sa FreeBSD o OpenBSD, ang imong mga resulta mahimong magkalahi. Kung gisulayan nako ang usa ka piho nga Linux, gipunting nako kini.

Samtang mahimo nimong gamiton kini nga kahibalo sa paghimo og usa ka app gikan sa wala ug kini hingpit nga ma-optimize, labing maayo nga dili kana buhaton. Kung magsulat ka ug bag-ong web server sa C o C++ para sa aplikasyon sa negosyo sa imong organisasyon, mahimo’g kini ang imong katapusang adlaw sa trabaho. Bisan pa, ang pagkahibalo sa istruktura sa kini nga mga aplikasyon makatabang sa pagpili sa naa na nga mga programa. Mahimo nimong itandi ang mga sistema nga gibase sa proseso sa mga sistema nga gibase sa thread ingon man mga gibase sa panghitabo. Imong masabtan ug mapasalamatan ngano nga ang Nginx mas maayo kay sa Apache httpd, nganong ang usa ka Tornado based Python nga aplikasyon makaalagad sa mas daghang tiggamit kumpara sa usa ka Django based Python application.

ZeroHTTPd: Himan sa Pagkat-on

ZeroHTTPd usa ka web server nga akong gisulat gikan sa sinugdan sa C isip himan sa pagtudlo. Wala kini mga dependency sa gawas, lakip ang pag-access sa Redis. Gipadagan namo ang among kaugalingong mga pamaagi sa Redis. Tan-awa sa ubos para sa dugang detalye.

Bisan kung mahimo naton hisgutan ang teorya sa gitas-on, wala’y mas maayo kaysa pagsulat sa code, pagpadagan niini, ug pagtandi sa tanan nga mga arkitektura sa server sa usag usa. Kini ang labing klaro nga pamaagi. Busa, magsulat kami og yano nga ZeroHTTPd web server gamit ang matag modelo: process-based, thread-based, ug event-based. Atong tan-awon ang matag usa niini nga mga server ug tan-awon kung unsa ang ilang nahimo kung itandi sa usag usa. Ang ZeroHTTPd gipatuman sa usa ka C file. Ang server nga nakabase sa panghitabo naglakip uthash, usa ka maayo nga pagpatuman sa hash table nga moabut sa usa ka header file. Sa ubang mga kaso, walay mga dependency, aron dili komplikado ang proyekto.

Adunay daghang mga komento sa code aron matabangan ka nga masabtan. Ingon usa ka yano nga web server sa pipila ka linya sa code, ang ZeroHTTPd usa usab ka gamay nga balangkas alang sa pagpalambo sa web. Kini adunay limitado nga gamit, apan makahimo sa pag-alagad sa mga static nga mga file ug yano kaayo nga "dinamikong" nga mga panid. Kinahanglan kong isulti nga ang ZeroHTTPd maayo alang sa pagkat-on kung giunsa paghimo ang high-performance nga mga aplikasyon sa Linux. Sa kinatibuk-an, kadaghanan sa mga serbisyo sa web naghulat alang sa mga hangyo, susihon kini ug iproseso kini. Mao gyud kini ang buhaton sa ZeroHTTPd. Kini usa ka himan alang sa pagkat-on, dili paghimo. Dili kini maayo sa pagdumala sa sayup ug dili tingali ipanghambog ang labing kaayo nga mga gawi sa seguridad (oh oo, gigamit nako strcpy) o ang batid nga mga limbong sa pinulongang C. Apan nanghinaut ko nga maayo ang iyang trabaho.

Pagganap sa Aplikasyon sa Linux Network. Pasiuna
ZeroHTTPd home page. Mahimo kini nga mag-output sa lainlaing mga tipo sa file lakip ang mga imahe

Aplikasyon sa Guest Book

Ang modernong mga aplikasyon sa web kasagaran dili limitado sa static nga mga file. Duna silay mga komplikadong interaksyon sa lain-laing mga database, mga cache, ug uban pa. Mao nga maghimo kami og usa ka yano nga aplikasyon sa web nga gitawag og "Guest Book" diin ang mga bisita magbilin og mga entry ubos sa ilang mga ngalan. Ang guest book stores entries nga nahabilin sa sayo pa. Adunay usab usa ka bisita counter sa ubos sa panid.

Pagganap sa Aplikasyon sa Linux Network. Pasiuna
Web application nga "Guest Book" ZeroHTTPd

Ang bisita nga counter ug mga bisita nga libro gitipigan sa Redis. Alang sa komunikasyon sa Redis, ang kaugalingon nga mga pamaagi gipatuman; wala sila magdepende sa gawas nga librarya. Dili ako usa ka dako nga fan sa pag-roll out sa homebrew code kung adunay magamit sa publiko ug maayo nga nasulayan nga mga solusyon. Apan ang katuyoan sa ZeroHTTPd mao ang pagtuon sa pasundayag sa Linux ug pag-access sa mga serbisyo sa gawas, samtang ang pagserbisyo sa mga hangyo sa HTTP adunay grabe nga epekto sa pasundayag. Kinahanglan natong bug-os nga kontrolon ang mga komunikasyon sa Redis sa matag usa sa atong mga arkitektura sa server. Sa pipila ka mga arkitektura gigamit namon ang pag-block sa mga tawag, sa uban gigamit namon ang mga pamaagi nga nakabase sa panghitabo. Ang paggamit sa usa ka eksternal nga librarya sa kliyente sa Redis dili maghatag niini nga kontrol. Dugang pa, ang among gamay nga kliyente sa Redis naghimo lamang og pipila ka mga gimbuhaton (pagkuha, pag-set, ug pagdugang sa usa ka yawe; pagkuha ug pagdugang sa usa ka array). Dugang pa, ang Redis protocol hilabihan ka elegante ug yano. Dili nimo kinahanglan nga espesyal nga itudlo kini. Ang kamatuoran nga ang protocol naghimo sa tanan nga trabaho sa mga usa ka gatos nga linya sa code nagpakita kung unsa kini ka maayo nga gihunahuna.

Ang mosunud nga numero nagpakita kung unsa ang gibuhat sa aplikasyon kung ang kliyente (browser) nangayo /guestbookURL.

Pagganap sa Aplikasyon sa Linux Network. Pasiuna
Giunsa pagtrabaho ang aplikasyon sa libro sa bisita

Kung kinahanglan nga i-isyu ang usa ka panid sa guest book, adunay usa ka tawag sa file system aron basahon ang template sa memorya ug tulo ka tawag sa network sa Redis. Ang template file naglangkob sa kadaghanan sa HTML nga sulod para sa panid sa screenshot sa ibabaw. Adunay usab espesyal nga mga placeholder alang sa dinamikong bahin sa sulud: mga post ug bisita nga counter. Gidawat namo sila gikan sa Redis, gisulod kini sa panid ug gihatagan ang kliyente sa hingpit nga naporma nga sulud. Ang ikatulo nga tawag sa Redis mahimong malikayan tungod kay gibalik ni Redis ang bag-ong yawe nga kantidad kung gidugangan. Bisan pa, alang sa among server, nga adunay usa ka asynchronous nga arkitektura nga nakabase sa panghitabo, daghang mga tawag sa network usa ka maayong pagsulay alang sa mga katuyoan sa pagkat-on. Mao nga gisalikway namon ang kantidad sa pagbalik sa Redis sa gidaghanon sa mga bisita ug gipangutana kini sa usa ka lahi nga tawag.

Mga arkitektura sa server ZeroHTTPd

Nagtukod kami og pito ka mga bersyon sa ZeroHTTPd nga adunay parehas nga gamit apan lainlain nga mga arkitektura:

  • Nagbalikbalik
  • Fork server (usa ka proseso sa bata matag hangyo)
  • Pre-fork server (pre-forking sa mga proseso)
  • Server nga adunay mga execution thread (usa ka thread kada hangyo)
  • Server nga adunay paghimo sa pre-thread
  • Gibase sa arkitektura poll()
  • Gibase sa arkitektura epoll

Gisukod namo ang pasundayag sa matag arkitektura pinaagi sa pagkarga sa server sa mga hangyo sa HTTP. Apan kung itandi ang parehas kaayo nga mga arkitektura, ang gidaghanon sa mga pangutana nagdugang. Gisulayan namon ang tulo ka beses ug gikalkula ang kasagaran.

Pamaagi sa pagsulay

Pagganap sa Aplikasyon sa Linux Network. Pasiuna
ZeroHTTPd load testing setup

Importante nga kung magpadagan sa mga pagsulay, ang tanan nga mga sangkap dili modagan sa parehas nga makina. Sa kini nga kaso, ang OS adunay dugang nga pag-iskedyul sa overhead samtang ang mga sangkap nakigkompetensya alang sa CPU. Ang pagsukod sa operating system nga overhead sa matag usa sa pinili nga mga arkitektura sa server mao ang usa sa labing importante nga mga tumong niini nga ehersisyo. Ang pagdugang sa daghang mga variable mahimong makadaot sa proseso. Busa, ang setting sa hulagway sa ibabaw labing maayo.

Unsa ang gibuhat sa matag usa niini nga mga server?

  • load.unixism.net: Dinhi kita modagan ab, Apache Benchmark utility. Naghimo kini og load nga gikinahanglan aron masulayan ang among mga arkitektura sa server.
  • nginx.unixism.net: Usahay gusto namong magpadagan og labaw sa usa ka instance sa usa ka server program. Aron mahimo kini, ang Nginx server nga adunay angay nga mga setting nagtrabaho isip usa ka load balancer nga gikan ab sa among mga proseso sa server.
  • zerohttpd.unixism.net: Dinhi among gipadagan ang among mga programa sa server sa pito ka lain-laing mga arkitektura, tagsa-tagsa.
  • redis.unixism.net: Kini nga server nagpadagan sa Redis daemon, diin gitipigan ang mga entry sa guestbook ug mga counter sa bisita.

Ang tanan nga mga server nagdagan sa parehas nga core sa processor. Ang ideya mao ang pagtimbang-timbang sa labing taas nga pasundayag sa matag arkitektura. Tungod kay ang tanan nga mga programa sa server gisulayan sa parehas nga hardware, kini usa ka baseline alang sa pagtandi. Ang akong pag-setup sa pagsulay naglangkob sa mga virtual server nga giabangan gikan sa Digital Ocean.

Unsa ang atong gisukod?

Mahimo nimong sukdon ang lainlaing mga timailhan. Among gisusi ang performance sa matag arkitektura sa usa ka gihatag nga configuration pinaagi sa pagkarga sa mga server sa mga hangyo sa lain-laing lebel sa parallelism: ang load motubo gikan sa 20 ngadto sa 15 ka dungan nga mga tiggamit.

Mga resulta sa pagsulay

Ang mosunud nga tsart nagpakita sa pasundayag sa mga server sa lainlaing mga arkitektura sa lainlaing lebel sa paralelismo. Ang y-axis mao ang gidaghanon sa mga hangyo matag segundo, ang x-axis kay parallel nga koneksyon.

Pagganap sa Aplikasyon sa Linux Network. Pasiuna

Pagganap sa Aplikasyon sa Linux Network. Pasiuna

Pagganap sa Aplikasyon sa Linux Network. Pasiuna

Sa ubos usa ka lamesa nga adunay mga resulta.

mga hangyo kada segundo

paralelismo
nagbalikbalik
tinidor
pre-tinidor
streaming
pre-streaming
poll
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
dako nga pagkaylap
2138

5000
-
dako nga pagkaylap
1600
1100
2519
-
2235

8000
-
-
1200
dako nga pagkaylap
2451
-
2100

10
-
-
dako nga pagkaylap
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Gikan sa graph ug lamesa makita nga labaw sa 8000 nga dungan nga mga hangyo aduna na lang kami duha ka magdudula nga nahabilin: pre-fork ug epoll. Samtang nagkadaghan ang load, ang usa ka server nga nakabase sa poll mas grabe kaysa usa ka streaming. Ang thread-pre-creation nga arkitektura usa ka takus nga kakompetensya sa pag-epoll, usa ka testamento kung unsa ka maayo ang pag-iskedyul sa Linux kernel sa daghang mga thread.

ZeroHTTPd Source Code

ZeroHTTPd Source Code dinhi. Adunay usa ka lahi nga direktoryo alang sa matag arkitektura.

ZeroHTTPd │ ├── 01_iterative │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking ─ ─ ─ ─ ─ . threading │ ├── main.c ├── 04_prethreading │ ├── main.c ├── 05_poll │ ├── main.c ├── 06_epoll │ └─── Make.c ├ ├ file ├── index .html │ └── tux png └── templates └── guestbook └── index.html

Dugang pa sa pito ka mga direktoryo alang sa tanan nga mga arkitektura, adunay duha pa sa taas nga lebel nga direktoryo: publiko ug mga template. Ang una naglangkob sa index.html file ug ang hulagway gikan sa unang screenshot. Mahimo nimong ibutang ang ubang mga file ug folder didto, ug ang ZeroHTTPd kinahanglan nga mag-alagad sa mga static nga mga file nga wala’y mga problema. Kung ang agianan sa browser motakdo sa agianan sa public folder, nan ang ZeroHTTPd mangita sa index.html file niini nga direktoryo. Ang sulod alang sa bisita nga libro nahimo nga dinamikong paagi. Kini adunay usa lamang ka home page, ug ang sulod niini gibase sa file nga 'templates/guestbook/index.html'. Ang ZeroHTTPd dali nga nagdugang dinamikong mga panid alang sa extension. Ang ideya mao nga ang mga tiggamit makadugang sa mga templates niini nga direktoryo ug i-extend ang ZeroHTTPd kung gikinahanglan.

Aron matukod ang tanan nga pito ka mga server, pagdagan make all gikan sa top-level nga direktoryo - ug ang tanan nga mga pagtukod makita sa kini nga direktoryo. Ang mga executable nga mga file mangita alang sa publiko ug templates nga mga direktoryo sa direktoryo diin kini gilusad.

Linux API

Dili nimo kinahanglan nga batid kaayo sa Linux API aron masabtan ang impormasyon niining serye sa artikulo. Bisan pa, girekomenda nako ang pagbasa og dugang bahin niini nga hilisgutan; adunay daghang mga kapanguhaan sa pakisayran sa Internet. Bisan tuod kita mohikap sa pipila ka mga kategoriya sa Linux APIs, ang atong focus mao ang panguna sa mga proseso, mga thread, mga panghitabo, ug sa network stack. Dugang sa mga libro ug mga artikulo bahin sa Linux API, girekomenda usab nako ang pagbasa sa mana alang sa mga tawag sa sistema ug mga gamit sa librarya nga gigamit.

Performance ug Scalability

Usa ka nota bahin sa performance ug scalability. Sa teoriya, walay koneksyon tali kanila. Mahimo kang adunay usa ka serbisyo sa web nga maayo kaayo, nga adunay oras sa pagtubag nga pipila ka mga millisecond, apan dili kini sukod. Ingon usab, mahimo nga adunay usa ka dili maayo nga pasundayag sa web application nga nagkinahanglan og pipila ka mga segundo aron makatubag, apan kini nagtimbang sa napulo aron pagdumala sa napulo ka libo nga dungan nga mga tiggamit. Bisan pa, ang kombinasyon sa taas nga performance ug scalability usa ka gamhanan kaayo nga kombinasyon. Ang mga high-performance nga mga aplikasyon sa kasagaran naggamit sa mga kahinguhaan ug sa ingon episyente nga nagserbisyo sa mas daghang dungan nga mga tiggamit sa server, nga nagpakunhod sa gasto.

Mga buluhaton sa CPU ug I/O

Sa katapusan, sa pag-compute kanunay adunay duha ka posible nga matang sa mga buluhaton: alang sa I/O ug CPU. Ang pagdawat sa mga hangyo pinaagi sa Internet (network I/O), pag-alagad sa mga file (network ug disk I/O), pagpakigkomunikar sa database (network ug disk I/O) kay tanan I/O nga mga kalihokan. Ang ubang mga pangutana sa database mahimong medyo CPU intensive (pag-sort, aberids nga usa ka milyon nga resulta, ug uban pa). Kadaghanan sa mga aplikasyon sa web gilimitahan sa labing taas nga posible nga I/O, ug ang processor panagsa ra nga gigamit sa tibuuk nga kapasidad. Kung nakita nimo nga ang pipila ka buluhaton sa I/O naggamit ug daghang CPU, lagmit kini usa ka timaan sa dili maayo nga arkitektura sa aplikasyon. Kini mahimong magpasabot nga ang mga kapanguhaan sa CPU nausik sa pagdumala sa proseso ug pagbalhin sa konteksto - ug kini dili hingpit nga mapuslanon. Kung naghimo ka usa ka butang sama sa pagproseso sa imahe, pagkakabig sa audio file, o pagkat-on sa makina, nan ang aplikasyon nanginahanglan kusog nga mga kapanguhaan sa CPU. Apan alang sa kadaghanan sa mga aplikasyon dili kini ang kaso.

Pagkat-on og dugang mahitungod sa mga arkitektura sa server

  1. Bahin I: Nagbalikbalik nga Arkitektura
  2. Bahin II. Mga fork server
  3. Bahin III. Mga server sa pre-fork
  4. Bahin IV. Mga server nga adunay mga hilo sa pagpatay
  5. Bahin V. Pre-threaded servers
  6. Bahin VI. Ang arkitektura nga nakabase sa Pol
  7. Bahin VII. arkitektura nga nakabase sa epoll

Source: www.habr.com

Idugang sa usa ka comment