Сонымен, 56 миллион теңге не үшін?

Әлеуметтік желілерде латынға конвертация жасайтын порталдың бағасы 56 миллион екен деген тақырып жаңғырып тұр. Осы жобаға қатысы бар ау деген адамдар бұл тек сайт емес ал бүкіл бір бағдарламалар комплексі деп шарқ ұрып жатыр. Кодео саясаттан, өсек-аяңнан арылған сайт ретінде өзімнің жүргізген экспериментім жайлы жазбақпын.
Азын-аулақ мәлімет бойынша порталдың жүрегі конвертация жасайтын сервис болмақ. Логикаға салсақ қомақты қаржының көп бөлігі осы сервиске бөлінген болар. Одан бөлек фейсбук комментарийларында портал 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-ке айналдырып қайтарамыз
Экспериментке 4 CPU, RAM 8Гб болатын екі сервер алдым, біреуінде конвертер тұрады, екіншісінен performance тест қосамыз. Серверді қосқан кезде uwsgi арқылы 4 ядроға 4 процесс қостым. Осылайша python максимал күшінде жұмыс жасай алуы керек. Ал оның алдында nginx тұратын болады:

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
0 пікір
Тек тіркелген қолданушылар ғана пікір қалдыра алады.