Сонымен, 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