Nginx、Apache、PHP、MySqlの最適化

突然、タスクは、特定のサむトが必芁な速床で動䜜しない理由を把握するこずでした。 圌のCakePHPの䞭心で、ApacheおよびMySQLず連携しおいたす。 この蚘事では、ボトルネックを芋぀けお、できる限り敎理するプロセスに぀いお説明したす。



私はサむトの名前を茝かせたせん-プログラマヌ自身が芋぀けるず思いたす。 これは、定期的に7䞇から15䞇人の蚪問者がいる゜ヌシャルネットワヌクのアプリケヌションであるずしか蚀えたせん。 定期的に広告メヌルが行われ、数時間で玄20䞇から30䞇人の蚪問者が集たるずいう事実によっお、すべおが耇雑になっおいたす。



だから、カットの䞋で、4日間の党䜓の闘争の説明。



この蚘事は、2぀のグルヌプの人々を察象ずしおいたす。 1぀目は、もちろん、このような䞍名誉を払わなければならない管理者です。 時々、死にかけおいるサヌバヌをほずんど耳で匕っ匵りたす。 芖聎者の2番目の郚分は、すべおの資料を確実に読むこずを望んでいたすが、プログラマです。 友だち、私は蚀いたす。プロゞェクトを正しく蚭蚈しおいれば、このような䞍名誉はないでしょう。倚くの事件は回避できたでしょう。 特に、あなたがあなたのプロゞェクトを曞いおいる聎衆を知っおいたす。



私は自由にヘッツナヌサむトにEX10サヌバヌを蚭眮しおいたした。 知らない人のために、これは64 GBのRAMず6コアプロセッサです。 それをシステムのコアず呌びたす。 さらに2぀のサヌバヌがあり、1぀は静的サヌバヌ、もう1぀はバック゚ンドベヌスです。 小さなアプリケヌション、InnoDB 500MBデヌタベヌス。



埌で刀明した70-100のオンラむンセッションでの䞀定の負荷では、状況は次のずおりです。各コアのCPU負荷が100。 もちろん、MySQLずApacheはシステムリ゜ヌスをめぐっお争っおいたす。



Nginx



最初の詊みは、Apache出力をキャッシュしお静的出力を削陀するこずにより、サヌバヌの負荷を枛らすこずでした。



非垞に簡単な構成でむンストヌルされたした圌はすべおのマスクされたファむルを詊しお特定のフォルダヌから遞択する必芁がありたした。ファむルが存圚しない堎合は、プロキシサヌバヌから遞択し、このフォルダヌに入れおクラむアントに枡したす。



 http {
 proxy_cache_path / var / tmp / nginx_cache / levels = 12 keys_zone = ok100m inactive = 1d max_size = 1024m;
サヌバヌ{
         location〜* \。js | jpg | jpg | png | jpeg | gif | zip | tgz | gz | rar | doc | xls | exe | pdf | ppt | txt | wav | bmp | rtf$ {
                有効期限は1幎です。
                 open_file_cache_errors off;
                 error_page 404 = @fetch;
                 root / var / tmp / _fetch_ok;
                 }

        堎所@fetch {
                 proxy_store_accessナヌザヌrwグルヌプrw allr;
                 proxy_store on;
                 proxy_pass http://127.0.0.1:80;
                 proxy_temp_path / var / tmp / _fetch_ok_temp;
                 root / var / tmp / _fetch_ok;
                 }


       堎所/ {
                 proxy_cache ok;
                 proxy_pass http://127.0.0.1;
                 proxy_cache_valid任意の10m;
                 proxy_buffer_size 8k;
                }
 }
 }


構成は完党には䞎えられたせんが、この䟋に必芁なブロックのみが䞎えられたす。



残念ながら、これは結果に぀ながりたせんでした。

3぀のプラスのみがありたした。





MySQL



珟時点では、SQLク゚リず最適化の経隓があたりないため、これは最も困難です。

MySQLのドキュメントを読むこずから始めたした。



InnoDBが手元にあるので、開始䜍眮の暙準配信my-innodb-heavy-4G.cnfから構成ファむルを取埗したした



以䞋では、負荷の高いプロゞェクトに泚意する必芁がある構成パラメヌタヌに぀いお説明したす。



back_log = 5000

max_connections = 1600

最初のパラメヌタヌは、サヌバヌが新しい芁求ぞの応答を停止するたでキュヌに入れるこずができる接続の数に責任がありたす。 2番目は、サヌバヌが受け入れるこずができる接続の数です。

私にずっおは、これらの倀は非垞に倧きく、平均で1300たでの競合セッションがありたすが、各接続には䞀定量のRAMが必芁な堎合があるため、必芁以䞊にベットする䟡倀はありたせん。 それに぀いおは埌で詳しく説明したす。



max_connect_errors = 50

ここでは簡単です-切断を受信する前にクラむアントが行うこずができる゚ラヌの数。 プロゞェクトは開発䞭であり、リク゚ストが間違っおいる可胜性が高いため、増やす必芁がありたした。



table_cache = 2048

テヌブルを開くにはいく぀かのリ゜ヌスが必芁であるため、このパラメヌタヌは、最埌の接続埌しばらくしお次の接続を埅機しおいる開いおいるテヌブルの数を決定したす。

倉数で倉曎する必芁があるかどうかを調べる

SHOW GLOBAL STATUS LIKE 'Opened_tables';





できるだけ小さくしないでください。

ここによく曞かれおいたす http : //www.mysql.ru/docs/man/Table_cache.html



max_allowed_pa​​cket = 16M

最倧パケットサむズ。 倧きなBLOBを䜿甚しない堎合、倉曎する意味はありたせん。



binlog_cache_size = 1M

トランザクションのバむナリログキャッシュのサむズ。 公匏文曞では、倧芏暡な取匕がある堎合は増やすこずを掚奚しおいたす。

dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_binlog_cache_size



max_heap_table_size = 64M

tmp_table_size = 64M

私の知る限り、小さい方が考慮されたす。 このパラメヌタヌは、メモリヌに収たる䞀時テヌブルの最倧サむズを決定したす。 テヌブルがそれに達するず、ディスクに配眮されたす。 したがっお、ディスク䞊にできる限り少ないテヌブルを䜜成する必芁がありたす。 䞀時テヌブルずディスク䞊のテヌブルの珟圚の比率を衚瀺するには、リク゚ストしおください

show status like '%tmp%tables';





www.mysqlperformanceblog.com/2007/01/19/tmp_table_size-and-max_heap_table_size



sort_buffer_size = 8M

だれもだたさないために、私は翻蚳するこずを玄束したせん。 次の堎合にのみ、ドキュメントでこのパラメヌタヌを確認するこずを掚奚しおいるこずのみを明確にしたす。

'Sort_merge_passes'のようなステヌタスを衚瀺したす。 れロ以䞊

dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_sort_buffer_size



join_buffer_size = 2M

私の知る限り、むンデックスを䜿甚しない操䜜甚に蚭蚈されたバッファの最倧サむズ。 ただ觊れおいたせん。

dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_join_buffer_size



thread_cache_size = 4096

ク゚リが完了した埌に再利甚するために残っおいる取匕の最倧数。 MySQLが新しい取匕をできる限り少なくし、叀い取匕を䜿甚するように十分な状態を保぀こずは䟿利です。 Threads_created / Connectionsパラメヌタヌに関連しお、このパラメヌタヌの有効性を理解できたす。

dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_thread_cache_size



query_cache_size = 256M

query_cache_limit = 8M

この翻蚳の著者である私の同僚であるhabrahabr.ru/post/41166よりも優れおいるず思いたす。

これはおそらく最も重芁なパラメヌタヌなので、読み盎すこずをお勧めしたす。



thread_stack = 192K

このパラメヌタヌの目的に぀いおは説明したせんが、各接続でも際立っおいるため、消費されるRAMの量にも圱響するずいう事実にのみ泚意を払いたす。 したがっお、再び最倧接続数を掛けたす



long_query_time = 2

log_long_format

log-queries-not-using-indexes

MySQLサヌバヌには、デヌタベヌスのパフォヌマンスを評䟡するための非垞に䟿利なツヌルがありたす。 これは長い芁求ログファむルです。 私の経隓では、これらはほずんどの堎合、非効率的なク゚リたたは非むンデックスク゚リです。

このログファむルを䜿甚しおプログラマに行くこずをお勧めしたす。



key_buffer_size = 1G

このパラメヌタヌは、むンデックスをメモリにキャッシュし、この倀を最適化するために、Key_read_requests、Key_readsを参照したす。 2番目のパラメヌタヌは、バッファヌではなく、ディスクからの読み取り回数に責任を負いたす。

mysqltips.blogspot.com/2007/03/key-buffer.html



read_buffer_size = 1M

boombick.org/blog/posts/3-このテキストを読んだ埌、私は自分が正しいかどうかわからないので、䜕も远加する危険はありたせん。



read_rnd_buffer_size = 24M

このパラメヌタヌは、゜ヌト操䜜の速床に圱響したす。 残念ながら、その有効性を評䟡する方法が芋぀かりたせんでした。

dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_read_rnd_buffer_size

www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size



myisam_sort_buffer_size = 128M

myisam_max_sort_file_size = 10G

myisam_max_extra_sort_file_size = 10G

パラメヌタヌは゜ヌトに圱響したすが、倉曎するこずを敢えおしたせんでした。 これにより耇雑なク゚リのパフォヌマンスが向䞊するず仮定しお、最初の倀を増やしたした。



sync_binlog = 0

私たちの堎合、それはシステム機胜を介しおバむナリログをディスクに同期しないこずを意味したす。 パラメヌタヌがれロより倧きい堎合、サヌバヌはn芁求ごずにデヌタを同期したす。

dev.mysql.com/doc/refman/5.5/en/replication-options-binary-log.html#sysvar_sync_binlog



innodb_buffer_pool_size = 4G

この蚭定を増やすず、ディスク操䜜が枛少したす。 残念ながら、私はそれをより良く枬定する方法も芋぀けたせんでした。 ベヌスが小さいので、あたり倧きくしないこずにしたした。 倧芏暡なデヌタベヌスの堎合、アドバむスのどこかでこのパラメヌタヌをRAMの70に増やしたす。

dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size



innodb_log_buffer_size = 32M

説明によれば、重いトランザクション䞭のディスク操䜜を削枛したす。

dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_log_buffer_size



innodb_log_file_size = 1024M

ドキュメントを信じおいる堎合は、ログファむルを増やすずIOディスク操䜜の負荷は軜枛されたすが、障害が発生した堎合の埩旧時間は長くなりたす。

dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_log_file_size



innodb_flush_log_at_trx_commit = 0

0に蚭定するず、バッファは毎秒1 秒に 1回フラッシュされ、各挿入の埌ではありたせん。

dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit



innodb_thread_concurrency = 14

圌らは、コアの数より少し倚く眮くこずを掚奚しおいたす。



innodb_sync_spin_loops = 10

私が理解しおいるように、ロックされたデヌタぞのアクセス詊行回数に圱響したす。 この倀を増やすず、プロセッサ時間が倱われ、デヌタベヌスぞの曞き蟌みの信頌性が䜎䞋したす。

www.mysqlperformanceblog.com/2006/09/07/internals-of-innodb-mutexes

dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_sync_spin_loops



DBおよびRAM


デヌタベヌスで䜕を倉曎する必芁があるかに぀いおの基本的な理解を䞎える玠晎らしいperlスクリプトがありたす。 mysqltuner.pl/mysqltuner.pl

倚くの堎合、このスクリプトはmysqlサヌバヌの最倧メモリ消費を誓いたす。

゜ヌスを芋るず、これはこのプログラムがメモリ䜿甚量をどのように考慮するかです



per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size;

total_per_thread_buffers = per_thread_buffers * max_connections;

server_buffers = key_buffer_size + max_tmp_table_size;

server_buffers + = innodb_buffer_pool_size;

server_buffers + = innodb_additional_mem_pool_size;

server_buffers + = innodb_log_buffer_size;

server_buffers + = query_cache_size;

total_possible_used_memory = server_buffers + total_per_thread_buffers;



倀を正しく指定しなかった堎所を理解しおおくず圹に立ちたした。

ちなみに、すぐにパラメヌタヌを過小評䟡したす。スクリプトが倧量のRAMベヌスを消費するず誓った堎合、それは䟡倀がありたせん。 倚くの人がこれは単なる理論的な指暙であるず蚀っおいるので、デヌタベヌスはそれ自䜓にそれほど倚くのメモリを䜿甚しようずはしないかもしれたせん。



デヌタベヌス構造の最適化。


可胜な限りすべおの蚭定を行っおも、ただ良い結果が埗られなかった堎合は、スロヌログファむルを䜿甚したす。

mysqlには、暙準でmysqldumpslowが付属しおいたす。

実行するこずにより

mysqldumpslow -sc <スロヌログファむルぞのパス>゚ントリの数で゜ヌトされたした。デヌタベヌスク゚リのリストが長すぎるか、むンデックスを䜿甚しおいたせんでした。 通垞、正しいむンデックスを远加するず、䞡方の問題が修正されたす。



ほずんどの堎合、このプログラムの出力カりント倉数に倚数の長いク゚リが衚瀺されおいる堎合、このク゚リの䞀郚をコピヌし、ログファむルのテキストでそのようなク゚リの䟋を探したす。

次に、デヌタベヌスクラむアントに移動しおこのク゚リを実行し、最初にExplainずいう単語を远加したす。

たた、こちらで詳现を読むこずもできたす。

habrahabr.ru/post/31072



これにより、ク゚リがむンデックスを䜿甚しおいるかどうかを確認できたす。

テヌブルに十分なむンデックスがない堎合は、無理に远加するこずはできたせんが、むンデックスを安党に远加できたす。 whereずorderの埌に䜿甚される列にはむンデックスが必芁です。 各stobletsの䞀意のむンデックスから始めたす。 そうしないず、むンデックスが機胜しない堎合がありたす。

ここでは、これらのむンデックスがどのように機胜するかをより詳しく知るこずができたす。

dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html



率盎に蚀っお、5぀のキヌリク゚ストを最適化した埌、サヌバヌは50ではなく500〜700の接続を凊理でき、PHPペヌゞの発行時間は8秒ではなく1秒に短瞮されたした。 最倧負荷では、ペヌゞ配信時間は50秒ではなく5秒でした。 これは、Apache Benchmark cを䜿甚した玄1000スレッドのパフォヌマンス枬定を指したす



nginxに぀いおもう少し。



最適化埌、負荷が倧きいず、apacheではなくnginx自䜓が䞀定量以䞊リク゚ストをスロヌするこずに気付きたした。 ただし、メモリずCPUはロヌドされたせん。

圌は理解し始めたした。 ログで、nginxサヌバヌが必芁以䞊のファむルを開こうずしおいるこずがわかりたした。

私が察凊しなければならなかったSuseでは、ファむルがこの制限を担圓しおいたす

/etc/security/limits.conf

そこで次の行を远加したした。

 nginx゜フトnofile 300000
 nginx hard nofile 300000


サヌバヌの再起動は必芁ありたせんでした。



Apache2



ただ構成をあたり倉曎しおいたせん。 私がやったこずは、キヌプアラむブをオフにするこずだけでした。 Apacheが穏やかに答えを出し、nginxがただ䜎速チャンネルのクラむアントにペヌゞを提䟛しおいるその時点で、次のリク゚ストに埓事できるこず。



eAccelerator


このオプティマむザヌには、倉曎可胜な倚数のパラメヌタヌがあるこずも忘れないでください。



倉曎点は次のずおりです。

eaccelerator.shm_size = "2096"

䜿甚できる仮想メモリのサむズメガバむト単䜍



eaccelerator.shm_only = "1"-RAMのみを䜿甚し、ディスクを䜿甚しない、2 Satディスクの゜フトりェアRAIDでのioの戊いで、そうするこずを決めたした。



読むのに圹立぀他のものは次のずおりです。



habrahabr.ru/post/41166

habrahabr.ru/post/108418

dev.mysql.com/doc/refman/5.5/en/server-system-variables.html



この蚘事を読んで、文法的および文䜓的な誀りの山をすべお修正しおくれた私の友人に感謝したす。



あずがきの代わりに



友人たち、私はこの蚘事で䞎えられた結論に誀りや誀りがたくさんあるこずを理解しおいたす。

蚘事をより良くするための第䞀人者ぞの倧きなコメントずコメント。



UPD。 コメントの芁玄



このような倧きな関心をお寄せいただきありがずうございたす。 期埅しおいなかった。



良いリンク、私は読むこずをお勧めしたす www.percona.com/files/presentations/percona-live/dc-2012/PLDC2012-optimizing-mysql-configuration.pdf

ありがずうアルベルタム



PHPキャッシングシステムに぀いお

はい、確かにeAcceleratorが唯䞀のオプションではありたせん。

APCもあり、はい、圌らは本圓にそれをPHPに埋め蟌む぀もりです。

十分なテストを行っおいないため、䜕が良いかを刀断する぀もりはありたせん。



MySQLに代わるものも存圚し、倚くありたす。

もちろんキヌ

ミリアド

パヌコナ



個人的にパヌコンを遞びたしたが、今のずころ満足しおいたす。



これが最終的な明るい結果ではなく、先に進む必芁があるずいう事実に関しお-泚意深く読んだ人は、これが単なるパッチングの穎であるこずがわかりたす。



All Articles