Сонымен, 56 миллион теңге не үшін?
-
raimbek
- Үйдегі эксперименттер / 9 қараша 2017, 19:04
- 4361
Әлеуметтік желілерде латынға конвертация жасайтын порталдың бағасы 56 миллион екен деген тақырып жаңғырып тұр. Осы жобаға қатысы бар ау деген адамдар бұл тек сайт емес ал бүкіл бір бағдарламалар комплексі деп шарқ ұрып жатыр. Кодео саясаттан, өсек-аяңнан арылған сайт ретінде өзімнің жүргізген экспериментім жайлы жазбақпын.
Азын-аулақ мәлімет бойынша порталдың жүрегі конвертация жасайтын сервис болмақ. Логикаға салсақ қомақты қаржының көп бөлігі осы сервиске бөлінген болар. Одан бөлек фейсбук комментарийларында портал 100 мың бір мезеттегі пайдаланушыларды көтеруі керек деп жазылған. Мұнда RPS (request per second) па әлде жай адам саны айтылды ма маған қараңғы. RPS жайлы айтылуы өте қиын секілді, өйткені секундына 100 мың сұраныс болатын жобаны әлі көрмеппін. Қазақстанның бүкіл сайтын әр жолы конвертациялайтындай етіп, бүкіл мобильді телефондарды да осыған қосып, олар ешқандай кэш пайдаланбай, логика пайдаланбай серверді тоқпақтайтын етсек қана сондай нагрузкаға қол жеткізуге болатын сияқты.
Жарайды, бізге қандай сервис керектігін көру үшін прототип жазып көрейік. Яғни, өте қарапайым конвертациялайтын сервис. Менің сервисім өте қарапайым, тек кириллицадан латынға ғана өткізе алады. Кодты мына жерден қарай аласыздар.
Сервиске POST сұраныс денесінде кириллица беруіміз керек. Жауап ретінде латынға айналған жауап келеді:
Конвертацияның қысқаша алгоритмі:
Оған қоса nginx көп байланыс орната алуы үшін кішігірім тюнинг жасаймыз:
Енді екінші серверден көп пайдаланушыны иммитациялауды yandex-tank арқылы жасаймыз. Барлық жерде ulimit көтерілгенін ескерте кетейін. Барлық конфигурациялар github-та. Алдымен атқылайтын оқтарды дайындаймыз:
Тестті іске қосамыз:

Суретте көрінгендей бастапқыда 1000 пайдаланушыға дейін көрдім. Сервер оңай көтерді. Ал екінші атқылауда RPS санын 10000 пайдаланушыға дейін көтердім. Пайдаланушылар саны сызықтық түрде 10 минут бойына өсетін болады. Нәтижесінде 4000 пайдаланушы кезінде барлық сұраныстарға 502 қайта бастады. Яғни, лимитті таптық.


Айтылғандар соңғы графикте айқын көрініп тұр. Демек бір сервер 3000 RPS көтере алады. Менің ойымша, аяқасты жазыла салған прототипке жаман емес. Бұл да аздық еткендей apache benchmark қостым:
Бес мыңға жақындап қалыппыз, бірақ ab тек бірдей мәтін жібереді, сұраныстар уақыты константа. Сондықтан, 3000 RPS деп қалдырғанымыз дұрыс, әрі нақты болмақ.
Сервердің жағдайы:

100 пайызға дейін жеткізе алмадым, демек оптимизация жасайтын жерлер бар, тюнинг жасайтын да жерлер бар. Бірақ жай прототипке тым көп болып кетер. Сервисімізді бағалау үшін осы да жеткілікті.
Енді бағаласақ. Егер біздің сервисімізге шын мәнінде 100 000 RPS келетін болса бізге 100 000 / 3000 ~= 34 сервер қажет. Мен пайдаланған секілді VPS пайдаланатын болсақ (шын өмірде ешқашан олай болмайды) бір жылға бір серверге 216 мың теңге (18000 * 12) екен (https://megahost.kz/vps/ssd/) оны 34-ке көбейтетін болсақ 7344000 теңге. Серверімізге кететін шығын осынша екен.
БІРАҚ! Прототип қой бұл, егер алгортимді әлдеқайда арзан жұмыс жасайтын етсек, кэш қоссақ, load balancing жасасақ, майда көп сервердің орнына бірнеше үлкен серверлер алып Қазақтелекомнан орын сатып алып қойып қоятын болсақ. Алдағы 10 жылдағы шығынымыз мына бөлінген ақшадан да аз болып шығады ау.
БІРАҚ! Бұл енді басталып келе жатқан жоба ғой, шын мәнінде higload болатын жобада, алдын ала аппокалипсиске қыруар сервер алып тастап дайындалмайды, ал нагрузка шетімен өсуіне байланысты вертикальді немесе горизонтальді масштабталып кете береміз. Яғни, бірінші жыл үшін бізге 34 сервер емес, 4 қана сервер де жетіп қалуы мүмкін. Егер статистика сақтау керек болса, тағы бірнеше сервер қосып, queue арқылы мәлімет жинаймыз, жұмыс істеу уақытына әсер етпеуі үшін.
Азын-аулақ мәлімет бойынша порталдың жүрегі конвертация жасайтын сервис болмақ. Логикаға салсақ қомақты қаржының көп бөлігі осы сервиске бөлінген болар. Одан бөлек фейсбук комментарийларында портал 100 мың бір мезеттегі пайдаланушыларды көтеруі керек деп жазылған. Мұнда RPS (request per second) па әлде жай адам саны айтылды ма маған қараңғы. RPS жайлы айтылуы өте қиын секілді, өйткені секундына 100 мың сұраныс болатын жобаны әлі көрмеппін. Қазақстанның бүкіл сайтын әр жолы конвертациялайтындай етіп, бүкіл мобильді телефондарды да осыған қосып, олар ешқандай кэш пайдаланбай, логика пайдаланбай серверді тоқпақтайтын етсек қана сондай нагрузкаға қол жеткізуге болатын сияқты.
Жарайды, бізге қандай сервис керектігін көру үшін прототип жазып көрейік. Яғни, өте қарапайым конвертациялайтын сервис. Менің сервисім өте қарапайым, тек кириллицадан латынға ғана өткізе алады. Кодты мына жерден қарай аласыздар.
Сервиске POST сұраныс денесінде кириллица беруіміз керек. Жауап ретінде латынға айналған жауап келеді:
(ENV) raimbek@titan:~/projects/latin-converter$ curl -X POST -d "қазақша текст" http:// 127.0.0.1:8888 /convert qazaqs'a tekst
Конвертацияның қысқаша алгоритмі:
- Мәтінді list типіне өткіземіз
- Цикл арқылы барлық әріптерді алдын ала дайындалған dict бойынша ауыстырып шығамыз
- List типін string-ке айналдырып қайтарамыз
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 172.104.147.14;
location / {
include uwsgi_params;
uwsgi_pass unix:/opt/latin-converter/converter.sock;
}
}
Оған қоса nginx көп байланыс орната алуы үшін кішігірім тюнинг жасаймыз:
worker_rlimit_nofile 100000;
events {
worker_connections 4000;
multi_accept on;
use epoll;
}
Енді екінші серверден көп пайдаланушыны иммитациялауды yandex-tank арқылы жасаймыз. Барлық жерде ulimit көтерілгенін ескерте кетейін. Барлық конфигурациялар github-та. Алдымен атқылайтын оқтарды дайындаймыз:
python ammo_generator.py 172.104.147.14 10000 > converter.ammo
Тестті іске қосамыз:
docker run -v $(pwd):/var/loadtest --net host -it direvius/yandex-tank -c load.yaml

Суретте көрінгендей бастапқыда 1000 пайдаланушыға дейін көрдім. Сервер оңай көтерді. Ал екінші атқылауда RPS санын 10000 пайдаланушыға дейін көтердім. Пайдаланушылар саны сызықтық түрде 10 минут бойына өсетін болады. Нәтижесінде 4000 пайдаланушы кезінде барлық сұраныстарға 502 қайта бастады. Яғни, лимитті таптық.


Айтылғандар соңғы графикте айқын көрініп тұр. Демек бір сервер 3000 RPS көтере алады. Менің ойымша, аяқасты жазыла салған прототипке жаман емес. Бұл да аздық еткендей apache benchmark қостым:
root@localhost:/opt/latin-converter/load_test# ab -r -p test.txt -k -c 700 -n 20000 http:// 172.104.147.14/ convert
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 172.104.147.14 (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
Server Software: nginx
Server Hostname: 172.104.147.14
Server Port: 80
Document Path: /convert
Document Length: 166 bytes
Concurrency Level: 700
Time taken for tests: 4.149 seconds
Complete requests: 20000
Failed requests: 0
Non-2xx responses: 20000
Keep-Alive requests: 20000
Total transferred: 6320000 bytes
Total body sent: 188300000
HTML transferred: 3320000 bytes
Requests per second: 4819.98 [#/sec] (mean)
Time per request: 145.229 [ms] (mean)
Time per request: 0.207 [ms] (mean, across all concurrent requests)
Transfer rate: 1487.42 [Kbytes/sec] received
44316.52 kb/s sent
45803.94 kb/s total
Connection Times (ms)
min mean[±sd] median max
Connect: 0 1 2.9 0 21
Processing: 1 125 207.5 39 3303
Waiting: 0 125 207.5 39 3303
Total: 1 125 208.1 39 3303
Percentage of the requests served within a certain time (ms)
50% 39
66% 65
75% 100
80% 246
90% 331
95% 565
98% 789
99% 947
100% 3303 (longest request)
Негізгі назар аударатын жер мынау: Requests per second: 4819.98 [#/sec] (mean)Бес мыңға жақындап қалыппыз, бірақ ab тек бірдей мәтін жібереді, сұраныстар уақыты константа. Сондықтан, 3000 RPS деп қалдырғанымыз дұрыс, әрі нақты болмақ.
Сервердің жағдайы:

100 пайызға дейін жеткізе алмадым, демек оптимизация жасайтын жерлер бар, тюнинг жасайтын да жерлер бар. Бірақ жай прототипке тым көп болып кетер. Сервисімізді бағалау үшін осы да жеткілікті.
Енді бағаласақ. Егер біздің сервисімізге шын мәнінде 100 000 RPS келетін болса бізге 100 000 / 3000 ~= 34 сервер қажет. Мен пайдаланған секілді VPS пайдаланатын болсақ (шын өмірде ешқашан олай болмайды) бір жылға бір серверге 216 мың теңге (18000 * 12) екен (https://megahost.kz/vps/ssd/) оны 34-ке көбейтетін болсақ 7344000 теңге. Серверімізге кететін шығын осынша екен.
БІРАҚ! Прототип қой бұл, егер алгортимді әлдеқайда арзан жұмыс жасайтын етсек, кэш қоссақ, load balancing жасасақ, майда көп сервердің орнына бірнеше үлкен серверлер алып Қазақтелекомнан орын сатып алып қойып қоятын болсақ. Алдағы 10 жылдағы шығынымыз мына бөлінген ақшадан да аз болып шығады ау.
БІРАҚ! Бұл енді басталып келе жатқан жоба ғой, шын мәнінде higload болатын жобада, алдын ала аппокалипсиске қыруар сервер алып тастап дайындалмайды, ал нагрузка шетімен өсуіне байланысты вертикальді немесе горизонтальді масштабталып кете береміз. Яғни, бірінші жыл үшін бізге 34 сервер емес, 4 қана сервер де жетіп қалуы мүмкін. Егер статистика сақтау керек болса, тағы бірнеше сервер қосып, queue арқылы мәлімет жинаймыз, жұмыс істеу уақытына әсер етпеуі үшін.
-
+3