chain of #4 http://seoraise.ru the rings #6 http://kovrovec.ru overflow #7 http://magmeco.ru

SCGI, FastGCI против CGI – мои личные тесты на ligHTTPd

Перед релизом игры, встал вопрос, а сколько же я смогу обслужить пользователей?

И так выбор стоял между apache, nginx, lighttpd. Скажу сразу кроме как про Apache Benchmark дальше речи не пойдёт пр осервер apache :D Это единственное что они хорошо написали, и было это в 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 сервера :D , сохраняем под именем 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 и приколемся!

Комментарии

Написать комментарий.

Вы не авторизовались для того чтоб комментировать.



купить противопожарные панели. . официальный дилер пежо в москве, новости и пежо автосалон, контакты. . документооборот найти отзывы на форуме. . модная женская одежда 2009, форум. . установка замков в москве объявление.