Webサーバーとデータベースサーバーをセットアップするためのサービスを提供しています。 先日、
ochevidets.ruポータルの所有者であるIvan Usachevから、サイトのブレーキングを防ぐためのリクエストがありました。
ピーク時のページは、ページごとに最大5分間、長時間読み込まれ始めました。
更新:この記事は2010年に作成されました。 何かが変更されました。プログラムの新しいバージョンがリリースされ、nginxがいくつかのディレクティブを変更し、新しいディレクティブが登場しました。 これを覚えておいてください。
この場合、最初に行う必要があるのは、これがクライアントがサイトを訪問するプロバイダーの問題であるかどうかを確認することです。 インターネットは、データセンターからクライアントへの完全なパッケージパスがサイトとは無関係の理由で禁止される可能性があるネットワークの大規模な集合です。 したがって、他のプロバイダーを介してサイトをロードする速度をチェックします。
この目的には便利なサービスがあります。
http://site-perf.com/ (ヨーロッパのアクセスポイントを選択することをお勧めします)
http://tools.pingdom.com/
問題はプロバイダーにありませんでした。 さらに議論します。
かなり重いビデオコンテンツが聞こえます。 PHPスクリプトは非常に単純で、CPU時間をあまり消費しません。 top linuxコマンドの出力を見ることでこれを学びました。
サーバーには、各ディスクの読み取り速度が約60 mb / sの「ミラー」レイドがあります(サーバーは数年間稼働しています)。 サーバーは100 Mbpsのチャネルでインターネットに接続されています。これは、データの約20%がサービスデータであることを考慮すると、毎秒10メガバイトにほぼ相当します。
明らかに、線形読み取り速度は、イーサネットインターフェイスの帯域幅よりもはるかに高速です。 一見、問題はないはずです。
ソフトウェアRAIDが劣化状態になった場合はどうなりますか? この場合、そのパフォーマンスは何度も低下する可能性があります。 cat / proc / mdstatの出力を確認します-すべてのドライブ[UU]、すべて問題ありません。
さらに推論します。 問題が初めて発生しました。 出席者が増加しました。 ディスクサブシステムへの多くの要求。 多くのユーザーがサイトを並行して作業しているため、ハードドライブは常に頭の位置を変えており、シーク時間などの不快なことが原因で読み取り速度が驚異的に低下する可能性があります。
さらに、8 GBスワップからのfreeコマンドの出力から学んだように、300 MBが使用されましたが、それ自体は非常に悪い兆候です。 スワップからページを書き込んだり読み込んだりすると、特にパフォーマンスが低下する可能性があります。
同じtopコマンドの出力から、時間プロセスの70〜80%がio状態にあることがわかりました。つまり、入力が入力されるのを待機しています。 原則として、入力にはネットワークカードも含まれますが、muninのレポートによると、トラフィックのピークは70 Mbpsでした。 ピークパフォーマンスは達成されていません。
ここでは、もちろん、プロバイダーのチャネルが宣言された100 Mbpsを提供しない可能性があり、トラフィックを制限できることを考慮する必要があります。
しかし、mcからのディレクトリの通常の表示中に速度が低下したという事実を考えると、問題は明らかにディスクサブシステムにありました。
一般に、素晴らしいiotopユーティリティがありますが、それを使用するには、カーネルにCONFIG_TASK_IO_ACCOUNTING、CONFIG_TASK_DELAY_ACCT、CONFIG_TASKSTATSを含める必要があります。
コアは古く、これらのオプションは含まれていませんでした。 したがって、午後にはこの診断ツールを使用できませんでした。 サーバーを停止することは望ましくありませんでした。
最も頻繁に使用されるファイルをキャッシュすると、再配置の数が大幅に減少し、これによりサーバーが節約されることをお勧めします。
膨大な量のデータをキャッシュするために知っている最も美しい方法は、Max IQテクノロジーをサポートするRAIDカードです。 64 GB以上のSSDドライブがハードウェアRAIDコントローラーに接続されています。 そして出来上がり! 64 GBのキャッシュがあります! 美しい-しかし、最初は高価で、Max IQ(500ドル)および特別なSSDドライブ(1000ドルから)をサポートするコントローラー自体が必要です。
サーバーにはコントローラー用の場所がありましたが、追加のハードドライブ用ではありませんでした。 サーバーには非常にコンパクトな1Uシャーシがあります。 そこで、ファイルシステムのシステムキャッシュの使用を開始することにしました。 このキャッシュを増やすには、単にシステムメモリを増やします。
サーバーにはさらに4つのスロットがあり、既存のメモリモジュールのマーキングに焦点を当てて、必要なメモリが見つかりました。
2 GBのメモリがインストールされました。さらに8 GBを追加することをお勧めします。 オンラインストアで注文し、配達を期待している間に残りのポイントを設定することにしました。
フロントエンドとしてのサーバーはnginxを使用しており、私はそれで何ができるかを見ることにしました。
最初にインストールした
worker_processes 6;
2. 8 , nginx apache mysql.
/ :
http {
....
# sendfile(). sendfile() , ,
# .
sendfile on;
#
tcp_nopush on;
tcp_nodelay on;
# .
access_log off;
#
gzip on;
#
gzip_min_length 1000;
gzip_buffers 16 8k;
#
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/xhtml+xml;
}
flv mp4. ( /streaming) . , — , , .
flv- nginx --with-http_flv_module.
x264 (mp4), nginx .
flv. :
http {
...
server {
...
location ~ \.flv$ {
flv;
}
...
}
...
}
. , nginx , apache. :
server {
listen 80;
server_name www.ochevidets.ru ochevidets.ru;
...
location / {
limit_conn one 30;
proxy_pass http://127.0.0.1:8128/;
...
}
...
}
location flv
location ~ \.flv$ {
limit_conn one 2;
proxy_pass http://127.0.0.1:8128;
proxy_buffer_size 2m;
...
}
nginx . :
location /video/ {
root /home/ochev/html/ochevidets.ru/;
}
location ~ /video/.*\.flv$ {
root /home/ochev/html/ochevidets.ru/;
flv;
# 2
limit_conn one 2;
}
server
# ,
# 150
limit_rate_after 1m;
set $limit_rate 150k;
- , - . - )
php.ini - php-.
eaccelerator :
zend_extension="//eaccelerator.so"
eaccelerator.shm_size="8" ; shared memory
eaccelerator.cache_dir="/home/ochev/tmp/eaccelerator" ; , shared memory
eaccelerator.enable="1" ;
eaccelerator.optimizer="1" ;
eaccelerator.check_mtime="1" ; ,
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0" ; shared memory
eaccelerator.compress="0" ; shared memory
ab, .
ab -c 10 -n 20 -t 20 http://www.ochevidets.ru/
— 10, 20, — 20
Time per request 0.35 . : eaccelerator mod_php 4,11 c 22,53 92,67 .
mysql. --log-slow-queries=_. , 30 . :
... ORDER BY RAND(), ...... LIMIT ...
RAND() 2
. .
nginx , . , ?
linux- :
curl --head ____http
- -, ,
be1.ru/stat
:
Cache-control —
Expires — ,
Pragma — , cache-control
Etag — - . ,
:
:
ochevidets.ru/userfiles/1209/images/2010/12/ekaterinburg/0.jpg
Status: HTTP/1.1 301 Moved Permanently
Server: nginx/0.8.53
Date: Wed, 01 Dec 2010 19:47:26 GMT
Content-type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://www.ochevidets.ru/userfiles/1209/images/2010/12/ekaterinburg/0.jpg
Cache-control: max-age=3600
Expires: Wed, 01 Dec 2010 20:47:26 GMT
Content-length: 404
, .
, , , www.
, ,
ochevidets.ru ,
www.ochevidets.ru. .
.htaccess :
#
#RewriteCond %{HTTP_HOST} ^ochevidets\.ru$ [NC]
#RewriteCond %{REQUEST_URI} !^/robots\.txt$
#RewriteRule ^(.*)$ http://www.ochevidets.ru/$1 [R=301,L]
#
# ochevidets.ru
RewriteCond %{HTTP_HOST} ^ochevidets\.ru$ [NC]
RewriteRule ^((.*/)|)$ http://www.ochevidets.ru/$1 [R=301,L]
.htaccess, httpd.conf, .
.htaccess :
Status: HTTP/1.1 200 OK
Server: nginx/0.8.53
Date: Wed, 01 Dec 2010 19:53:24 GMT
Content-type: image/jpeg
Connection: keep-alive
Last-modified: Wed, 01 Dec 2010 09:25:20 GMT
Etag: "62957-1511b-49655e24e2000"
Accept-ranges: bytes
Content-length: 86299
Cache-control: max-age=864000
Expires: Sat, 11 Dec 2010 19:53:24 GMT
.
, . :
. . . . .
.
—
2-3 ( ).
, , — RAM, nginx apache, .
UPDATE :
- mysql dulepov (thread_cache_size = 36, wait_timeout = 300).
- nginx alexxxst
- ab WoZ siege
- alfa curl -I