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 ʻ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.
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.
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
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.
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.
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.