ʻO ka hana noi pūnaewele Linux. Hoʻolauna

Hoʻohana ʻia nā noi pūnaewele ma nā wahi āpau, a ma waena o nā protocol transport āpau, noho ʻo HTTP i ka ʻāpana liona. Ke aʻo ʻana i nā nuances o ka hoʻomohala ʻana i nā noi pūnaewele, nui ka poʻe e nānā liʻiliʻi i ka ʻōnaehana hana kahi e holo maoli ai kēia mau noi. ʻO ka hoʻokaʻawale ʻana o ka hoʻomohala (Dev) a me nā hana (Ops) i hōʻino wale i ke kūlana. Akā me ka piʻi ʻana o ka moʻomeheu DevOps, lilo nā mea hoʻomohala i ke kuleana no ka holo ʻana i kā lākou mau noi i ke ao, no laila he mea pono loa iā lākou e kamaʻāina pono i ka hope o ka ʻōnaehana hana. He mea maikaʻi loa kēia inā e hoʻāʻo ʻoe e hoʻonohonoho i kahi ʻōnaehana no nā tausani a i ʻole ʻumi kaukani o nā pilina like.

Ua like loa nā palena o nā lawelawe pūnaewele me nā mea ma nā noi ʻē aʻe. ʻO nā mea kaulike hoʻouka a i ʻole nā ​​kikowaena waihona, loaʻa i kēia mau noi āpau nā pilikia like ma kahi kūlana kiʻekiʻe. ʻO ka hoʻomaopopo ʻana i kēia mau palena kumu a pehea e lanakila ai iā lākou ma ka laulā e kōkua iā ʻoe e loiloi i ka hana a me ka scalability o kāu mau noi pūnaewele.

Ke kākau nei au i kēia pūʻulu ʻatikala no ka pane ʻana i nā nīnau mai nā mea hoʻomohala ʻōpio e makemake ana e lilo i mea hoʻolālā ʻōnaehana ʻike maikaʻi. ʻAʻole hiki ke hoʻomaopopo pono i nā ʻenehana loiloi noi Linux me ka ʻole o ka luʻu ʻana i nā kumu o ke ʻano o kā lākou hana ma ka pae ʻōnaehana hana. ʻOiai he nui nā ʻano o nā noi, ma kēia pūʻulu makemake wau e ʻimi i nā noi pūnaewele ma mua o nā noi papapihi e like me ka polokalamu kele pūnaewele a i ʻole ka hoʻoponopono kikokikona. Hoʻolālā ʻia kēia mea no nā mea hoʻomohala a me nā mea hoʻolālā e makemake e hoʻomaopopo i ka hana ʻana o nā polokalamu Linux a i ʻole Unix a pehea e kūkulu ai iā lākou no ka hana kiʻekiʻe.

ʻO Linux lumi kikowaena ʻōnaehana hana, a ʻo ka hapa nui o kāu mau noi e holo ma kēia OS. ʻOiai ke ʻōlelo nei au "Linux", ʻo ka hapa nui o ka manawa hiki iā ʻoe ke manaʻo palekana ʻo wau ke ʻōlelo nei i nā ʻōnaehana hana Unix-like ma ka laulā. Eia naʻe, ʻaʻole au i hoʻāʻo i ke code e pili ana i nā ʻōnaehana ʻē aʻe. No laila, inā makemake ʻoe iā FreeBSD a i ʻole OpenBSD, ʻokoʻa paha kāu mau hopena. Ke ho'āʻo wau i kahi Linux-specific, kuhikuhi wau iā ia.

ʻOiai hiki iā ʻoe ke hoʻohana i kēia ʻike no ke kūkulu ʻana i kahi polokalamu mai ka wā kahiko a e hoʻomaikaʻi maikaʻi ʻia, ʻoi aku ka maikaʻi ʻaʻole e hana i kēlā. Inā kākau ʻoe i kahi kikowaena pūnaewele hou ma C a i ʻole C++ no ka noi ʻoihana o kāu hui, ʻo kēia paha kou lā hope loa ma ka hana. Eia nō naʻe, ʻo ka ʻike ʻana i ke ʻano o kēia mau noi e kōkua i ke koho ʻana i nā papahana i loaʻa. Hiki iā ʻoe ke hoʻohālikelike i nā ʻōnaehana kaʻina hana me nā ʻōnaehana pili thread a me nā ʻōnaehana hanana. E hoʻomaopopo a mahalo ʻoe i ke kumu e hana maikaʻi ai ʻo Nginx ma mua o Apache httpd, no ke aha e hiki ai i kahi noi Tornado based Python ke lawelawe i nā mea hoʻohana hou aʻe i hoʻohālikelike ʻia me kahi noi Python based Django.

ZeroHTTPd: Mea Hana Aʻo

ZeroHTTPd he kikowaena pūnaewele aʻu i kākau ai mai ka wā ʻōpala ma C ma ke ʻano he mea aʻo. ʻAʻohe ona hilinaʻi waho, me ke komo ʻana iā Redis. Holo mākou i kā mākou mau kaʻina hana Redis. E nānā ma lalo no nā kikoʻī hou aku.

ʻOiai hiki iā mākou ke kūkākūkā i ke kumumanaʻo i ka lōʻihi, ʻaʻohe mea ʻoi aku ka maikaʻi ma mua o ke kākau ʻana i ke code, ka holo ʻana, a me ka hoʻohālikelike ʻana i nā hale hana kikowaena āpau me kekahi. ʻO kēia ke ala ʻike maopopo loa. No laila, e kākau mākou i kahi kikowaena pūnaewele ZeroHTTPd maʻalahi me ka hoʻohana ʻana i kēlā me kēia hiʻohiʻona: ke kaʻina hana, ka thread-based, a me ka hanana. E nānā kākou i kēlā me kēia o kēia mau kikowaena a ʻike i ke ʻano o kā lākou hana e hoʻohālikelike ʻia me kekahi. Hoʻokomo ʻia ʻo ZeroHTTPd i kahi faila C hoʻokahi uthash, kahi hoʻokō papaʻaina hash maikaʻi e hele mai i kahi faila poʻomanaʻo. I nā hihia ʻē aʻe, ʻaʻohe mea hilinaʻi, i ʻole e paʻakikī i ka papahana.

Nui nā manaʻo ma ke code e kōkua iā ʻoe e hoʻomaopopo. Ma ke ʻano he kikowaena pūnaewele maʻalahi i nā laina liʻiliʻi o ke code, ʻo ZeroHTTPd kahi hana liʻiliʻi no ka hoʻomohala pūnaewele. Loaʻa iā ia nā hana liʻiliʻi, akā hiki ke lawelawe i nā faila static a me nā ʻaoʻao "dynamic" maʻalahi loa. Pono wau e ʻōlelo he maikaʻi ʻo ZeroHTTPd no ke aʻo ʻana pehea e hana ai i nā noi Linux kiʻekiʻe. Ma ke ʻano nui, kali ka hapa nui o nā lawelawe pūnaewele i nā noi, e nānā iā lākou a hoʻoponopono iā lākou. ʻO kēia ka mea e hana ai ʻo ZeroHTTPd. He mea hana kēia no ke aʻo ʻana, ʻaʻole hana. ʻAʻole maikaʻi loa ia i ka hana hewa a ʻaʻole paha e kaena i nā hana palekana maikaʻi loa (ʻae, ua hoʻohana wau strcpy) a i ʻole nā ​​maalea akamai o ka ʻōlelo C. Akā, ke manaʻolana nei au e hana maikaʻi ana kāna hana.

ʻO ka hana noi pūnaewele Linux. Hoʻolauna
ʻO ka ʻaoʻao home ZeroHTTPd. Hiki iā ia ke hoʻopuka i nā ʻano faila like ʻole me nā kiʻi

Noi no ka buke malihini

ʻAʻole i kaupalena ʻia nā noi pūnaewele hou i nā faila static. Loaʻa iā lākou nā pilina paʻakikī me nā ʻikepili like ʻole, nā huna huna, a pēlā aku. No laila e hana mākou i kahi noi pūnaewele maʻalahi i kapa ʻia ʻo "Guest Book" kahi e waiho ai ka poʻe malihini i nā helu ma lalo o ko lākou mau inoa. Mālama ka puke malihini i nā mea i waiho mua ʻia. Aia kekahi helu kipa ma lalo o ka ʻaoʻao.

ʻO ka hana noi pūnaewele Linux. Hoʻolauna
Ka palapala noi pūnaewele "Buke malihini" ZeroHTTPd

Hoʻopaʻa ʻia ka helu kipa malihini a me nā helu puke malihini ma Redis. No nā kamaʻilio me Redis, hoʻokō ʻia nā kaʻina hana ponoʻī; ʻaʻole lākou i hilinaʻi i ka waihona waho. ʻAʻole wau makemake nui i ka ʻōwili ʻana i ka code homebrew i ka wā e loaʻa ai ka lehulehu a me nā hoʻonā i hoʻāʻo maikaʻi ʻia. Akā ʻo ke kumu o ZeroHTTPd e aʻo i ka hana Linux a me ke komo ʻana i nā lawelawe o waho, ʻoiai e lawelawe ana i nā noi HTTP he hopena koʻikoʻi koʻikoʻi. Pono mākou e hoʻomalu piha i nā kamaʻilio me Redis i kēlā me kēia o kā mākou kikowaena kikowaena. Ma kekahi mau papa hana hoʻohana mākou i ka pale ʻana i nā kelepona, ma nā mea ʻē aʻe hoʻohana mākou i nā kaʻina hana e pili ana i ka hanana. ʻAʻole e hāʻawi kēia mana i ka hoʻohana ʻana i kahi waihona mea kūʻai aku Redis waho. Hoʻohui, hana wale kā mākou mea kūʻai Redis liʻiliʻi i kekahi mau hana (loaʻa, hoʻonohonoho, a hoʻonui i kahi kī; kiʻi a hoʻopili i kahi array). Eia kekahi, he nani a maʻalahi ka protocol Redis. ʻAʻole pono ʻoe e aʻo kūikawā. ʻO ka ʻoiaʻiʻo o ka hana ʻana o ka protocol i nā hana āpau ma kahi o hoʻokahi haneli mau laina o ke code e hōʻike ana i ka maikaʻi o ka noʻonoʻo ʻana.

Hōʻike ke kiʻi aʻe i ka hana a ka mea noi ke noi mai ka mea kūʻai (browser). /guestbookURL.

ʻO ka hana noi pūnaewele Linux. Hoʻolauna
Pehea e hana ai ka palapala noi puke malihini

Ke hoʻopuka ʻia kahi ʻaoʻao puke malihini, aia hoʻokahi kelepona i ka ʻōnaehana faila e heluhelu i ka template i ka hoʻomanaʻo a me ʻekolu kelepona kelepona iā Redis. Aia i loko o ka waihona waihona ka hapa nui o nā ʻike HTML no ka ʻaoʻao ma ke kiʻi kiʻi ma luna. Aia kekahi mau wahi kūikawā no ka ʻāpana ikaika o ka ʻike: nā pou a me nā mea kipa kipa. Loaʻa iā mākou mai Redis, hoʻokomo iā lākou i loko o ka ʻaoʻao a hāʻawi i ka mea kūʻai aku me ka ʻike piha. Hiki ke pale ʻia ke kolu o ke kelepona iā Redis no ka mea e hoʻihoʻi ʻo Redis i ka waiwai kī hou ke hoʻonui ʻia. Eia nō naʻe, no kā mākou kikowaena, nona kahi hoʻolālā asynchronous e pili ana i ka hanana, ʻo ka nui o nā kelepona pūnaewele he hoʻāʻo maikaʻi no nā kumu aʻo. No laila, hoʻolei mākou i ka waiwai hoʻihoʻi Redis o ka helu o nā malihini a nīnau iā ia me kahi kelepona ʻokoʻa.

Nā hale kikowaena ZeroHTTPd

Ke kūkulu nei mākou i ʻehiku mau mana o ZeroHTTPd me ka hana like akā nā ʻano hana like ʻole:

  • Hoʻopau hou
  • Server fork (hoʻokahi kaʻina keiki no ke noi)
  • Ke kikowaena pre-fork (pre-forking o nā kaʻina hana)
  • Server me nā pae hoʻokō (hoʻokahi pae no ke noi)
  • Server me ka hana mua ʻana i ka thread
  • Hoʻokumu ʻia ka hoʻolālā poll()
  • Hoʻokumu ʻia ka hoʻolālā epoll

Ana mākou i ka hana o kēlā me kēia hoʻolālā ma ka hoʻouka ʻana i ke kikowaena me nā noi HTTP. Akā i ka hoʻohālikelike ʻana i nā hale hoʻolālā like loa, piʻi ka nui o nā nīnau. Hoʻāʻo mākou i ʻekolu manawa a helu i ka awelika.

ʻAno hoʻāʻo

ʻO ka hana noi pūnaewele Linux. Hoʻolauna
Hoʻonohonoho hoʻāʻo hoʻouka ZeroHTTPd

He mea nui ia i ka wā e holo ai i nā hoʻokolohua, ʻaʻole holo nā ʻāpana āpau ma ka mīkini hoʻokahi. I kēia hihia, hoʻonui ka OS i ka hoʻonohonoho hoʻonohonoho ʻana ma luna o ka hoʻokūkū o nā ʻāpana no ka CPU. ʻO ke ana ʻana i ka ʻōnaehana hana ma luna o kēlā me kēia hale kikowaena kikowaena i koho ʻia kekahi o nā pahuhopu nui loa o kēia hoʻomaʻamaʻa. ʻO ka hoʻohui ʻana i nā mea hoʻololi hou e lilo i mea pōʻino i ke kaʻina hana. No laila, ʻoi aku ka maikaʻi o ka hoʻonohonoho ʻana i ke kiʻi ma luna.

He aha ka hana a kēlā me kēia kikowaena?

  • load.unixism.net: ʻO kēia kahi a mākou e holo ai ab, pono pono Apache Benchmark. Hoʻopuka ia i ka ukana e pono ai e hoʻāʻo i kā mākou kikowaena kikowaena.
  • nginx.unixism.net: I kekahi manawa makemake mākou e holo ʻoi aku ma mua o hoʻokahi manawa o kahi polokalamu kikowaena. No ka hana ʻana i kēia, ʻo ka server Nginx me nā hoʻonohonoho kūpono e hana ʻia ma ke ʻano he mea hoʻohālikelike ukana e hele mai ana ab i kā mākou mau hana kikowaena.
  • zerohttpd.unixism.net: Ma ʻaneʻi mākou e holo ai i kā mākou mau polokalamu kikowaena ma nā ʻano hoʻolālā like ʻole ʻehiku, hoʻokahi i ka manawa.
  • redis.unixism.net: Ke holo nei kēia kikowaena i ka Redis daemon, kahi e mālama ʻia ai nā helu puke malihini a me nā helu kipa.

Holo nā kikowaena a pau ma ka mea hoʻoheheʻe hoʻokahi. ʻO ka manaʻo e loiloi i ka hana kiʻekiʻe o kēlā me kēia hoʻolālā. No ka mea ua hoʻāʻo ʻia nā polokalamu kikowaena a pau ma ka lako like, he kumu kēia no ka hoʻohālikelike. ʻO kaʻu hoʻonohonoho hoʻāʻo he mau kikowaena virtual i hoʻolimalima ʻia mai Digital Ocean.

He aha kā mākou e ana?

Hiki iā ʻoe ke ana i nā hōʻailona like ʻole. Hoʻolālā mākou i ka hana o kēlā me kēia hale hana i kahi hoʻonohonoho i hāʻawi ʻia e ka hoʻouka ʻana i nā kikowaena me nā noi ma nā pae like ʻole o ka parallelism: piʻi ka ukana mai 20 a 15 mau mea hoʻohana like.

Nā hopena hōʻike

Hōʻike ka pakuhi ma lalo nei i ka hana o nā kikowaena ma nā hale hoʻolālā like ʻole ma nā pae like ʻole o ka parallelism. ʻO ka axis y ka helu o nā noi i kēlā me kēia kekona, ʻo ka x-axis he mau pili like.

ʻO ka hana noi pūnaewele Linux. Hoʻolauna

ʻO ka hana noi pūnaewele Linux. Hoʻolauna

ʻO ka hana noi pūnaewele Linux. Hoʻolauna

Aia ma lalo kahi papa me nā hopena.

noi i kekona

puʻuleʻi
hoʻomau hou
lāʻau
pre-fork
kahe ana
pre-streaming
piʻi
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
palahalaha akea
2138

5000
-
palahalaha akea
1600
1100
2519
-
2235

8000
-
-
1200
palahalaha akea
2451
-
2100

10
-
-
palahalaha akea
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Mai ka pakuhi a me ka papaʻaina hiki ke ʻike ʻia ma luna o 8000 mau noi like ʻelua wale nō nā mea pāʻani i koe: pre-fork a me epoll. Ke piʻi aʻe ka ukana, ʻoi aku ka maikaʻi o kahi kikowaena koho balota ma mua o kahi hoʻolaha. He mea hoʻokūkū kūpono ka hoʻolālā thread-pre-creation i ka epoll, he hōʻike i ka maikaʻi o ka hoʻonohonoho ʻana o ka kernel Linux i nā helu he nui.

ZeroHTTPd Source Code

ZeroHTTPd Source Code maanei. Aia kekahi papa kuhikuhi no kēlā me kēia hale kūkulu.

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

Ma waho aʻe o nā papa kuhikuhi ʻehiku no nā hale hoʻolālā āpau, ʻelua mau mea hou aʻe i ka papa kuhikuhi kiʻekiʻe: lehulehu a me nā templates. Aia ka waihona index.html a me ke kiʻi mai ka kiʻi kiʻi mua. Hiki iā ʻoe ke waiho i nā faila a me nā waihona ʻē aʻe ma laila, a pono ʻo ZeroHTTPd e lawelawe i kēlā mau faila static me ka pilikia ʻole. Inā like ke ala o ka polokalamu kele pūnaewele me ke ala i loko o ka waihona lehulehu, a laila ʻimi ʻo ZeroHTTPd i ka faila index.html ma kēia papa kuhikuhi. Hoʻokumu ʻia ka ʻike no ka puke malihini. He ʻaoʻao home wale nō kona, a ua hoʻokumu ʻia kāna ʻike ma ka faila 'templates/guestbook/index.html'. Hoʻohui maʻalahi ʻo ZeroHTTPd i nā ʻaoʻao ikaika no ka hoʻonui. ʻO ka manaʻo e hiki i nā mea hoʻohana ke hoʻohui i nā templates i kēia papa kuhikuhi a hoʻonui iā ZeroHTTPd e like me ka mea e pono ai.

No ke kūkulu ʻana i nā kikowaena ʻehiku, holo make all mai ka papa kuhikuhi kiʻekiʻe - a ʻike ʻia nā kūkulu āpau i kēia papa kuhikuhi. Nānā nā faila hoʻokō i ka lehulehu a me nā papa kuhikuhi ma ka papa kuhikuhi kahi i hoʻomaka ai lākou.

API no Linux

ʻAʻole pono ʻoe e mākaukau i ka Linux API e hoʻomaopopo i ka ʻike ma kēia moʻo ʻatikala. Eia naʻe, manaʻo wau e heluhelu hou aʻe ma kēia kumuhana; nui nā kumuwaiwai kuhikuhi ma ka Pūnaewele. ʻOiai e hoʻopā mākou i nā ʻāpana he nui o nā API Linux, ʻo kā mākou manaʻo nui e pili ana i nā kaʻina hana, nā pae, nā hanana, a me ka waihona pūnaewele. Ma waho aʻe o nā puke a me nā ʻatikala e pili ana i ka Linux API, paipai wau e heluhelu i ka mana no nā kelepona ʻōnaehana a me nā hana waihona i hoʻohana ʻia.

Hana a me ka Scalability

Hoʻokahi memo e pili ana i ka hana a me ka scalability. ʻO ke kumu, ʻaʻohe pilina ma waena o lākou. Hiki iā ʻoe ke loaʻa kahi lawelawe pūnaewele e hana maikaʻi loa ana, me ka manawa pane o kekahi mau milliseconds, akā ʻaʻole ia i ka nui. Pēlā nō, loaʻa paha kahi polokalamu pūnaewele maikaʻi ʻole e lawe i kekahi mau kekona e pane ai, akā hoʻonui ʻia i nā ʻumi e mālama i nā ʻumi kaukani o nā mea hoʻohana like. Eia naʻe,ʻo ka hui pūʻana o ka hana kiʻekiʻe a me ka scalability he hui ikaika loa. Hoʻohana liʻiliʻi nā noi hana kiʻekiʻe i nā kumuwaiwai a no laila e lawelawe maikaʻi i nā mea hoʻohana like ʻole ma ke kikowaena, e hōʻemi ana i nā kumukūʻai.

Nā hana CPU a me I/O

ʻO ka hope, ma ka helu helu ʻana, ʻelua mau ʻano hana: no I/O a me CPU. ʻO ka loaʻa ʻana o nā noi ma luna o ka Pūnaewele (network I/O), lawelawe i nā faila (network and disk I/O), ke kamaʻilio ʻana me ka waihona (network and disk I/O) nā hana I/O āpau. Hiki i kekahi mau nīnau waihona waihona ke hoʻoikaika iki i ka CPU (ka hoʻokaʻawale ʻana, ka awelika o nā hopena miliona, etc.). Hoʻopili ʻia ka hapa nui o nā noi pūnaewele e ka I/O kiʻekiʻe loa, a ʻaʻole hoʻohana ʻia ka mea hana i ka piha piha. Ke ʻike ʻoe i ka hoʻohana ʻana o kekahi hana I/O i ka nui o ka CPU, he hōʻailona paha ia o ka hoʻolālā noi noi maikaʻi ʻole. Hiki i kēia ke manaʻo ua pau nā kumuwaiwai CPU i ka hoʻokele kaʻina a me ka hoʻololi ʻana i ka pōʻaiapili - a ʻaʻole pono loa kēia. Inā ʻoe e hana nei i kahi mea e like me ka hoʻoili kiʻi, ka hoʻololi ʻana i nā faila leo, a i ʻole ke aʻo ʻana i ka mīkini, a laila pono ka noi i nā kumuwaiwai CPU ikaika. Akā no ka hapa nui o nā noi ʻaʻole kēia ka hihia.

E aʻo hou e pili ana i nā hale hana kikowaena

  1. Mahele I: Hoʻolālā Hoʻohui
  2. Mahele II. Nā kikowaena fork
  3. Mahele III. Nā kikowaena pre-fork
  4. Mahele IV. Nā kikowaena me nā kaula o ka hoʻokō
  5. Mahele V. Nā kikowaena pre-threaded
  6. Mahele VI. ʻO ka hale hoʻolālā pol
  7. Mahele VII. hale hoʻolālā epoll

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka