SCGI, FastGCI против CGI – мои личные тесты на ligHTTPd
Перед релизом игры, встал вопрос, а сколько же я смогу обслужить пользователей?
И так выбор стоял между apache, nginx, lighttpd. Скажу сразу кроме как про Apache Benchmark дальше речи не пойдёт пр осервер apache
Это единственное что они хорошо написали, и было это в 1996 году, да и то вряд ли всё хорошо, но не суть.
Я давно мучался с NGINX, но после того как я понял что он не обрабатывает symlinks он меня до конца затрахал, то есть он обрабатывает но патчи хератчи + танцы с бубнами – никакой стабильности нет кароче.
Все поняли что речь пойдёт в данной статье о ligHTTPd
Станачала ставим:
1 | yum install lighttpd |
Сразу же прикручиваем PHP как неотъемлемую часть для WEB сервера
1 | yum install lighttpd-fastcgi php-cli |
Незабываем подправить конфиг PHP
1 | /etc/php.ini |
В самый конец конфига добавляем
1 | cgi.fix_pathinfo = 1 |
Раскоментируем или добавим, у кого как, в файле lighttpd.conf следующую конструкцию:
1 2 3 4 5 6 7 8 | fastcgi.server = ( ".php" => ( "localhost" => ( "socket" => "/tmp/php-fastcgi.socket", "bin-path" => "/usr/bin/php-cgi" ) ) ) |
Добавляем так же в конструкции server.modules
1 | mod_scgi, |
Комментируем следующие модули:
1 | #mod_cgi, |
Еще добавляем следующее:
1 2 3 4 5 6 7 8 9 10 11 | scgi.server = ( "/cgi-bin/test.cgi" => ( ( "host" => "127.0.0.1", "port" => 666, "max-procs" => 1, "bin-environment" => ("REAL_SCRIPT_NAME" => ""), "check-local" => "disable" ) ) ) |
Сразу, рабочий пример на perl, ещё раз РАБОЧИЙ ПРИМЕР НА PERL SCGI сервера
, сохраняем под именем scgi.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/perl use strict; use warnings; use SCGI; use IO::Socket::INET; use Data::Dumper; my $socket = IO::Socket::INET->new( Listen => 5, ReuseAddr => SO_REUSEADDR, LocalPort => 666 ) or die "can't bind: $!"; my $scgi = SCGI->new($socket, blocking => 0); while (my $request = $scgi->accept) { $request->read_env(); $request->connection->print("Content-Type: text/plain\n\n"); $request->connection->print(Dumper $request->env()); $request->close(); } |
Вроде бы всё, дальше запускаем наш SCGI сервер
1 | ./scgi.cgi |
Перезапускам сервер:
1 | /etc/init.d/lighttpd restart |
Если вы всё сделали как я написал, то вы получили иполностью рабочий веб сервер + PHP через FastCGI + SCGI через perl! О ЕЗ
Двигаемся дальше.
Ниже я привелё два теста, первый тест это модул mod_cgi, второй через scgi, смотрим.
MOD_CGI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | ab -n 100000 -c 100 http://home.kirkh.ru/cgi-bin/test.pl This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking tpz.kirkh.ru (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: lighttpd/1.4.22 Server Hostname: home.kirkh.ru Server Port: 80 Document Path: /cgi-bin/test.pl Document Length: 5 bytes Concurrency Level: 100 Time taken for tests: 289.975 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 14900000 bytes HTML transferred: 500000 bytes Requests per second: 344.86 [#/sec] (mean) Time per request: 289.975 [ms] (mean) Time per request: 2.900 [ms] (mean, across all concurrent requests) Transfer rate: 50.18 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.7 0 26 Processing: 12 290 36.7 282 624 Waiting: 6 290 36.7 282 624 Total: 32 290 36.8 282 624 Percentage of the requests served within a certain time (ms) 50% 282 66% 287 75% 291 80% 294 90% 304 95% 377 98% 429 99% 461 100% 624 (longest request) |
MOD_SCGI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ab -n 100000 -c 100 http://home.kirkh.ru/cgi-bin/scgi.cgi This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking home.kirkh.ru (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: lighttpd/1.4.22 Server Hostname: home.kirkh.ru Server Port: 80 Document Path: /cgi-bin/test.cgi Document Length: 860 bytes Concurrency Level: 100 Time taken for tests: 189.023 seconds Complete requests: 100000 Failed requests: 199 (Connect: 0, Receive: 0, Length: 199, Exceptions: 0) Write errors: 0 Non-2xx responses: 14 Total transferred: 99317095 bytes HTML transferred: 85837181 bytes Requests per second: 529.04 [#/sec] (mean) Time per request: 189.023 [ms] (mean) Time per request: 1.890 [ms] (mean, across all concurrent requests) Transfer rate: 513.11 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 9 Processing: 1 147 2652.7 8 189010 Waiting: 0 147 2652.4 8 189010 Total: 1 148 2652.8 9 189015 Percentage of the requests served within a certain time (ms) 50% 9 66% 10 75% 10 80% 10 90% 13 95% 14 98% 3004 99% 3011 100% 189015 (longest request) |
Что мы видим из этой всей хуйни написанной выше? А видим мы следующее, то что SCGI обработол на 100 секунд быстрее, но с 200 ошибками, но это не критичные ошибки так что можно сделать вывод, CGI – В топку SCGI рулед!
А 100 секунд это ведь практически 2 минуты, а для веб сервера 2 минуты представляете что такое?
Но и это ещё не всё! В тесте использовался файл который просто выводит переменные окружения(scgi), и HELO WORLD для (cgi) то есть если бы сделать равное то я думаю было бы все 150 секунд.
Теперь рассмотрим разницу между вообще CGI и SCGI:
Когда вы браузером обращаетесь к сайту то при установленном mod_cgi, барузер кадлый раз запускает новый экземпляр приложения в нашем случае было test.pl, а как видно это не программка а код, то есть вывод каждый раз запускается perl, если подключилось 100 параллельно пользователей а то и 1000 то у нас на серваке аврал, 1000 копий PERL запустилос, нихуя не катит так ведь?
Теперь какой-то умныц человек придумал SCGI, FastCGI, тут всё пизже, экземпляры не запускаются, но зато висит в амяти всегда один perl и обрабатывает подключения, как видно из примера выше.
То есть, не тратится время на запуск нового perl а сразу обрабатывается это существенно экономит время в нашем случае сэкономили 2 минуты! Это же охренеть как много!
а представим ситуацию в моём случае – игра:
Смысл игры такой, подрубиться к PostgreSQL что-то там сделать и отдать результат.
В случае с mod_cgi запускается Perl и подрубается к БД и так повторяется к примеру 1000 раз, то есть прикинули – 1000 подключений к БД.
В случае с mod_scgi так как мы не запускаем миллиарды экземпляром PERL о нам и не надо подрубаться к БД 1000 раз, мы запускаемся один раз, подключаемся к БД и ждём только команд, то есть тут экономия и скорость выростет в геометрической програссии просто, вот так вот.
Все прочитали и сделали вывод, о том что
apache – вчерашний день, nginx – гавно по настройки и ваще гавняно всё у него там, тем более пишет один человек, поймали его вечером парни нассали на него и всё нет больше NGINX и всё, lighttpd – рулед, в настройке просто класс крут до невозможности и так далее всё я пошёл дописывать игру мать вашу, позднее выложе только тест с подключением к бд и выводом инфы через mod_cgi и через mod_scgi и приколемся!
Комментарии
Написать комментарий.
Вы не авторизовались для того чтоб комментировать.
