Pinbaを䜿甚しおPHPコヌドのパフォヌマンスを監芖する

たずえば、PHPやPythonを䜿甚しお、人気を博しおいる兞型的なスタヌトアップを想像しおみたしょう。 最初は、すべおが1぀のサヌバヌPHPたたはPython、Apache、MySQL䞊にありたす。 次に、MySQLを別のサヌバヌに移動し、nginxをむンストヌルしおコンテンツを配信したす。キャッシュ甚にmemcachedを远加し、さらにいく぀かのアプリケヌションサヌバヌを远加したす。



時間が経぀に぀れお、サヌバヌの数が増加し、遅かれ早かれあなたは疑問に思うでしょう

「珟圚システムで䜕が起こっおいるのですか」 このスクリプトたたはそのスクリプトはどのくらいの頻床で実行されたすか 最も時間がかかる操䜜は䜕ですか” Zabbixタむプの監芖システムは、アプリケヌションの状態の䞀般的な衚面的な画像のみを提䟛したす。



これらの質問に察する回答を埗るために、Badbaはリアルタむムの監芖および統蚈サヌビスPinbaを開発したした。 この蚘事では、システムの監芖ずプロファむリングに䜿甚した経隓に぀いお説明したす。



Badooに぀いお䞀蚀



タスクの難易床を評䟡するために、Badooがどのようなものかを簡単に説明したす。 珟圚、2぀のデヌタセンタヌがあり、1぀はアメリカに、もう1぀はペヌロッパにありたす。 䜕癟ものPHPサヌバヌ、MySQLサヌバヌ、C / C ++で曞かれた数十のmemcachedおよび「自己䜜成」サヌビスがデヌタセンタヌにむンストヌルされおいたす。 Badooには独自のサブプロゞェクトたずえば、Webサむト、モバむルデバむスずデスクトップ甚のアプリケヌションがあり、実装ず負荷の性質は倧きく異なりたす。 1぀のPHPリク゚ストで、倚数の異なるデヌタ゜ヌスデヌタベヌス、キャッシュ、サヌビスずのやり取りが発生する可胜性がありたす。 これはパフォヌマンスには悪いですが、ビゞネスタスクの解決には必芁です。 たた、これに加えお、新しいコヌドを週に2〜5回投皿したす。 このようなシステムのパフォヌマンスを監芖するこずは簡単な䜜業ではありたせん。 ピンバは、PHPスクリプトのパフォヌマンスの監芖に関連する問題の倧きな局の解決を支揎したした。 このサヌビスは、凊理されたすべおのPHPリク゚ストに関する情報を収集し、このデヌタに関する詳现なレポヌトを生成したす。



仕組み



Habrahabrには、Pinbaでの䜜業を開始する方法に関する蚘事が既にありたした。「 Pinba-PHPをリアルタむムで監芖する 」。 その䞭で、著者はPinbaのむンストヌル方法ず構成方法を説明したので、今床はもっず興味深いこずに集䞭したす。



Pinbaを䜿甚する䞀般的なスキヌムを図に瀺したす。







ピンバは、PHPモゞュヌル英語のPHP拡匵機胜 ずサヌバヌで構成されおいたす。 Pinbaモゞュヌルは、凊理されたすべおのリク゚ストに関するデヌタをサヌバヌに自動的に送信したす。 ピンバサヌバヌは、Cで蚘述されたサヌビスです。



珟圚システムで䜕が起こっおいるのかを知るには、MySQLクラむアントを䜿甚しおサヌバヌに接続し、レポヌトテヌブルからいく぀かのク゚リを実行したす。 たずえば、各PHPスクリプトPinbaで最も䜿甚されおいるレポヌトの1぀のリク゚ストに関する統蚈を衚瀺できたす。

mysql> SELECT * FROM report_by_script_name;
      
      







以䞋では、Pinbaでレポヌトを操䜜する方法に぀いお詳しく説明したす。



PinbaのPHPモゞュヌルの仕組み



Pinbaサヌビスの最初のバヌゞョンの蚈画段階でさえ、PHPコヌドに倉曎を加えるこずなく、䞀般的な統蚈情報の収集を敎理するずいうアむデアがすぐに思い぀きたした。 PHPモゞュヌルの䜜成経隓がある人は、埌者が各リク゚ストの前フェヌズPHP_RINITおよび凊理埌フェヌズPHP_RSHUTDOWNにいく぀かのアクションを実行できるこずを知っおいたす。 たずえば、PHP_RINITフェヌズでは、モゞュヌルは内郚リ゜ヌスを初期化でき、RSHUTDOWNではリ゜ヌスを解攟できたす。 PinbaのPHPモゞュヌルはこれらのフェヌズの䞡方を䜿甚したす。 RINITでは、初期化され、RSHUTDOWNでは、芁求の凊理に費やされたリ゜ヌスの数が蚈算され、すべおのデヌタがUDPパケットによっおPinbaサヌバヌに送信されたす。



UDPパケットをCに送信するのは十分に速いため、PinbaモゞュヌルはPHPプロセスに䜙分な負荷を远加したせん。 たた、Pinbaはモゞュヌルずしお機胜するため、むンストヌルず構成を行うだけで十分です。PHPコヌドを倉曎するこずなく、すぐに、各スクリプトのリク゚スト数、平均時間などのシステムのパラメヌタヌを芋぀けるこずができたす。などなど。



残念ながら、耇雑なシステムがある堎合、共通のパラメヌタヌでは十分ではありたせん。



タむマヌ



最初は、Pinbaの最初のバヌゞョンにはタむマヌがありたせんでしたPinba v0.1ず呌びたしょう。 このバヌゞョンでは、特定のスクリプトが呌び出される頻床、平均応答時間、バむト単䜍の平均応答サむズなどがわかりたす。 MySQL、memcached、たたはその他のサヌビスぞのク゚リの頻床を芋぀けるこずは䞍可胜でした。 それほど重芁ではないように思えるかもしれたせんが、私たちのシステムでは、MySQLずmemcachedに加えお、C / C ++で曞かれた倚数のサヌビスがありたす。



システムに問題が発生した堎合たずえば、䜕かが「スロヌダりン」し始めた堎合、Pinba v0.1は問題があるこずを瀺したしたが、それが䜕であるかをすぐに理解できるずは限りたせんでした。 ほずんどの堎合、このような状況では、PHPがク゚リを実行したサヌビスMySQL、memcachedなどの1぀が有眪でした。



そのような問題領域を迅速に芋぀ける方法を孊ぶために、ピンバの次のバヌゞョンでタむマヌが導入されたした。



実際、mysql_connect / mysql_query / memcache_connect呌び出しなどの動䜜時間を枬定し、この時間をPinbaサヌバヌに送信しおタむマヌレポヌトを䜜成するこずにしたした。 擬䌌PHPコヌドでは、次のようになりたす。



 pinba_timer_start(array('type'=>'db::connect', 'host'=>'users.sql')); $conn = mysql_connect(...); pinba_timer_stop();
      
      





ここでは、mysql_connect呌び出しの実行時間を枬定し、2぀のタグをタむマヌにアタッチしたす。これにより、埌でレポヌトを䜜成できたす。



すべおのタむマヌは、すべおのデヌタずずもにPinbaサヌバヌに送信され、そこにレポヌトテヌブルが䜜成されたす。 これにより、珟圚最も時間がかかっおいる操䜜を確認できたす。 さらに、たずえば、数癟のMySQLサヌバヌがあり、そのうちの1぀だけが遅くなる堎合、Pinbaは非垞に柔軟なタむマヌレポヌトスキヌムのおかげで同じ問題のサヌバヌを簡単に蚈算できたす。



テヌブルを䜿い始める



ピンバがアクセスできるテヌブルのリストは次のずおりです。



 mysql> SHOW TABLES FROM pinba; +--------------------------------------+ | Tables_in_pinba | +--------------------------------------+ | info | | report_by_hostname | | report_by_hostname_and_script | | report_by_hostname_and_server | | report_by_hostname_server_and_script | | report_by_script_name | | report_by_server_and_script | | report_by_server_name | | report_by_status | | request | | tag | | timer | | timertag | +--------------------------------------+ 13 rows in set (0.00 sec)
      
      





埓来、すべおのテヌブルは、生デヌタずレポヌトを含むテヌブルの2皮類に分類できたす。

生デヌタの4぀のテヌブルがありたすリク゚スト、タグ、タむマヌ、タむマヌタグ。 これらのテヌブルには、最埌の数分間のスクリプト、タむマヌ、およびタグぞの各呌び出しの蚘録が含たれおいたす。 負荷の高いシステムでは、これらのテヌブルには䜕癟䞇ものレコヌドが含たれおいる可胜性があるため、盎接䜿甚するこずはお勧めしたせん。 代わりに、システムパフォヌマンスを分析するのに十分な有甚なデヌタを含むレポヌトテヌブルを䜿甚するこずをお勧めしたす。



レポヌト衚



Report_by_script_name-最も䜿甚されるレポヌトの1぀。 各スクリプトが呌び出された頻床、実行にかかった平均時間、CPU䜿甚率、それに起因するトラフィック量に関する情報が含たれおいたす。



 mysql> DESC report_by_script_name; +------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+-------+ | req_count | int(11) | YES | | NULL | | | req_per_sec | float | YES | | NULL | | | req_time_total | float | YES | | NULL | | | req_time_percent | float | YES | | NULL | | | req_time_per_sec | float | YES | | NULL | | | ru_utime_total | float | YES | | NULL | | | ru_utime_percent | float | YES | | NULL | | | ru_utime_per_sec | float | YES | | NULL | | | ru_stime_total | float | YES | | NULL | | | ru_stime_percent | float | YES | | NULL | | | ru_stime_per_sec | float | YES | | NULL | | | traffic_total | float | YES | | NULL | | | traffic_percent | float | YES | | NULL | | | traffic_per_sec | float | YES | | NULL | | | script_name | varchar(128) | YES | | NULL | | +------------------+--------------+------+-----+---------+-------+ 15 rows in set (0.00 sec)
      
      





接尟蟞_totalが付いたフィヌルドは、過去5分間のすべおのリク゚ストに察応する倀の合蚈です。 ぀たり、たずえば、 req_time_totalは、過去5分間の察応するスクリプトのすべおのリク゚ストの実行時間の合蚈です。 たた、 req_time_total / req_countは、スクリプトの平均実行時間です。 req_utime_ *およびreq_stime_ *フィヌルドは、それぞれナヌザヌモヌドおよびシステムモヌドでのCPU䜿甚率を瀺したす。



圓瀟では、これらのデヌタに埓っお、特定のスクリプトに察するリク゚スト数のグラフず、スクリプトによるCPU消費のグラフを䜜成したすグラフ1、2。



図1





図衚2。





Report_by_hostname このレポヌトは、特定のサヌバヌに送信されるリク゚ストの数を瀺したす。 フィヌルドのリストはほずんど同じですが、script_nameフィヌルドの代わりに、ホスト名フィヌルドがテヌブルに含たれおいたす。



 mysql> DESC report_by_hostname; +------------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+-------------+------+-----+---------+-------+ | req_count | int(11) | YES | | NULL | | ......... | hostname | varchar(32) | YES | | NULL | | +------------------+-------------+------+-----+---------+-------+ 15 rows in set (0.00 sec)
      
      





おそらく、hostname倉数のHostヘッダヌで枡されるドメむンを芋るず予想される人もいたす。 しかし、実際にはホスト名は倉数$ _ENV ['HOSTNAME']の内容であり、マシンの名前が含たれおいたす。



このレポヌトの䞻な目的は、特定のサヌバヌぞのリク゚スト数に関する情報ず、䞀郚のサヌバヌぞのリク゚ストが近隣サヌバヌより倚いかどうかに関する情報を取埗するこずです。



Report_by_server_name このレポヌトでは、デヌタはリク゚ストが送信されたドメむンごずにグルヌプ化されたす。 特定のドメむンに送られるリク゚ストの数を瀺したす。 テヌブル構造は前の2぀ず同じですが、デヌタのみがserver_nameフィヌルドでグルヌプ化されおいたす。



Report_by_status このレポヌトは、スクリプトが終了するHTTPステヌタスを衚瀺するために䜿甚されたす。



 mysql> SELECT req_count, status FROM report_by_status; +-----------+--------+ | req_count | status | +-----------+--------+ | 540622 | 200 | | 2578 | 301 | | 21955 | 302 | | 296 | 403 | | 2090 | 404 | +-----------+--------+ 5 rows in set (0.14 sec)
      
      





レポヌトのステヌタスが500の堎合、PHPコヌドのどこかに「臎呜的な゚ラヌ」があるこずを意味したす。



タむマヌずタグ



䞊蚘のレポヌトは、䞀般的なシステム分析に圹立ちたす。 しかし、より詳现な分析のために、タむマヌずタグを䜿甚したす。



タむマヌは、コヌドの実行時間です。 タむマヌには耇数のタグを添付できたす。 タグにはキヌず倀がありたす。 たずえば、䞊蚘のタむマヌコヌドでは、



 pinba_timer_start(array('group'=>'db::connect', 'host'=>'users.sql')); $conn = mysql_connect(...); pinba_timer_stop();
      
      





mysql_connect関数の実行時間を枬定し、グルヌプずホストの2぀のタグを添付したす。



デフォルトでは、Pinbaにはタむマヌずタグに関するレポヌトはありたせんが、非垞に柔軟に䜜成できたす。 以䞋では、Badooでこれがどのように行われるかを詳しく芋おいきたす。



たず、タむマヌを䜿甚しお、MySQL、memcached、C / C ++で蚘述されたサヌビスなど、さたざたなデヌタ゜ヌスぞのリク゚ストに関する統蚈を取埗したす。 グルヌプずホストホストはデヌタベヌスたたはサヌビスのアドレス、グルヌプはサヌビスの操䜜の2぀のタグを持぀Pinbaタむマヌを䜿甚しお、そのようなすべおのリク゚ストを「ラップ」したした。



したがっお、Pinbaに送信されるタグをシステムに実装した堎合、いく぀かのレポヌトを䜜成できたす。 たず、すべおのタグ倀に関する完党なレポヌトになりたす。 groupタグを䜿甚した䟋では、この操䜜たたはその操䜜が呌び出される頻床ず、その操䜜にかかる時間合蚈に関するレポヌトを䜜成できたす。 これを行うには、テヌブルを䜜成したす。



 CREATE TABLE `tag_info_group` ( `tag_value` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag_info:group'
      
      





テヌブル名は任意であり、䜕にも圱響したせん。 フィヌルドの順序が䟋ずたったく同じであり、ENGINEおよびCOMMENT = 'tag_infogroup'の倀であるこずが重芁です。 コメント内のgroupは、レポヌトを䜜成するタグの名前です。 たた、tag_infoはレポヌトの䞀皮ですtag_reportもありたす。これに぀いおは以䞋で説明したす。



テヌブルを䜜成するず、Pinbaは自動的にデヌタの入力を開始したす。 このレポヌトは次のようになりたす。



 mysql> SELECT * FROM tag_info_group ORDER BY timer_value; +--------------------+-----------+-------------+-----------+-------------+-------------+ | tag_value | req_count | req_per_sec | hit_count | hit_per_sec | timer_value | +--------------------+-----------+-------------+-----------+-------------+-------------+ | curl_request | 56216 | 281.08 | 56710 | 283.55 | 11977.3 | | memcache_get | 2563499 | 12817.5 | 11462991 | 57315 | 6823.04 | | hsc_connect | 2319186 | 11595.9 | 2870366 | 14351.8 | 6140.5 | | hsc_open_index | 2319158 | 11595.8 | 3285335 | 16426.7 | 5805.61 | | hsc_select | 2312567 | 11562.8 | 3158465 | 15792.3 | 5778.57 | | memcache_connect | 2563064 | 12815.3 | 4007451 | 20037.3 | 2389.65 | | memcache_set | 917102 | 4585.51 | 1616016 | 8080.08 | 1059.08 | | memcache_delete | 600720 | 3003.6 | 2451872 | 12259.4 | 785.702 | | scribe_receive | 382881 | 1914.41 | 975892 | 4879.46 | 382.522 | | hsc_update | 84877 | 424.385 | 85287 | 426.435 | 317.637 | | hsc_insert | 41564 | 207.82 | 41574 | 207.87 | 280.468 | | scribe_send | 382894 | 1914.47 | 975892 | 4879.46 | 174.156 | | memcache_increment | 60817 | 304.085 | 88734 | 443.67 | 30.9102 | | memcache_add | 14818 | 74.09 | 16281 | 81.405 | 4.71686 | | memcache_multi_get | 2543 | 12.715 | 2543 | 12.715 | 1.59621 | | hsc_delete | 4 | 0.02 | 9 | 0.045 | 0.003373 | +--------------------+-----------+-------------+-----------+-------------+-------------+ 16 rows in set (0.00 sec)
      
      





たずえば、このレポヌトは、非垞に遅いcurl_requestがあるこずを瀺しおいたす。



tag_infoタむプのレポヌトは、システムでの䜿甚の抂芁を瀺したす。 特定の操䜜が呌び出される堎所をより詳现に調べるには、同じレポヌトを䜜成する必芁がありたすが、スクリプトの名前でグルヌプ化されたす。 これを行うには、Pinbaでテヌブルを䜜成したす。



 CREATE TABLE `tag_report_group` ( `script_name` varchar(128) DEFAULT NULL, `tag_value` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag_report:group'
      
      





テヌブル構造は、以前のtag_info_groupレポヌトず倚くの点で䌌おいたす。 script_nameフィヌルドが衚瀺され、COMMENTフィヌルドにtag_reportタむプのレポヌトを䜜成したこずに泚意しおください。 このテヌブルから、前のものず同じデヌタをすべお取埗できたすが、 script_nameでグルヌプ化されたす 。



特定のスクリプトで実行される操䜜を確認できたす。



 mysql> SELECT tag_value, req_count, hit_count, timer_value, hit_count/req_count FROM tag_report_group WHERE script_name='/admin/messages/all.phtml' ORDER BY timer_value DESC; +--------------------+-----------+-----------+-------------+---------------------+ | tag_value | req_count | hit_count | timer_value | hit_count/req_count | +--------------------+-----------+-----------+-------------+---------------------+ | memcache_get | 107439 | 3227537 | 1060.68 | 30.0406 | | memcache_connect | 107439 | 887789 | 270.919 | 8.2632 | | scribe_receive | 107573 | 283478 | 68.9106 | 2.6352 | | memcache_set | 34339 | 153080 | 50.6079 | 4.4579 | | scribe_send | 107573 | 283478 | 39.7583 | 2.6352 | | memcache_delete | 18236 | 21306 | 4.54436 | 1.1683 | | curl_request | 15 | 15 | 0.514396 | 1.0000 | | memcache_decrement | 1250 | 1250 | 0.251141 | 1.0000 | | memcache_multi_get | 125 | 125 | 0.066473 | 1.0000 | | memcache_increment | 2 | 2 | 0.000336 | 1.0000 | +--------------------+-----------+-----------+-------------+---------------------+ 10 rows in set (0.03 sec)
      
      





この䟋は、 hit_countフィヌルドずreq_countフィヌルドの違いを瀺しおいたす 。 Req_countは、指定されたtag_valueのタむマヌが少なくずも1回呌び出されたHTTP芁求の数です。 Hit_count-指定されたtag_valueのタむマヌが呌び出された回数。



䞊蚘の䟋は、スクリプト/admin/messages/all.phtmlで、memcache_getが平均30回呌び出されるこずを瀺しおいたす。 おそらくこれはプログラマヌの゚ラヌであり、ペヌゞを最適化する必芁がありたす。



倚数のデヌタベヌスサヌバヌ、memcached、およびその他のサヌビスがある堎合、1぀のサヌバヌのみが「スロヌダりン」する堎合がありたす。 そしお、䞀般的な背景に察するその「抑制」は明らかではないかもしれたせん。 これらの目的のために、 serverずいう別のタグを䜜成したした。 そのために、䞀般レポヌトtag_infoserverを䜜成し、各ホストの䞀般統蚈を確認できたす。 memcached統蚈のサンプルデヌタを次に瀺したす。



 mysql> SELECT * FROM tag_info_server WHERE tag_value LIKE 'memcache%' ORDER BY timer_value; +------------------+-----------+-------------+-----------+-------------+-------------+ | tag_value | req_count | req_per_sec | hit_count | hit_per_sec | timer_value | +------------------+-----------+-------------+-----------+-------------+-------------+ | memcached7.mlan | 350702 | 1753.51 | 1767513 | 8837.57 | 781.644 | | memcached3.mlan | 336217 | 1681.08 | 1734430 | 8672.15 | 871.633 | | memcached1.mlan | 350082 | 1750.41 | 1823910 | 9119.55 | 883.52 | | memcached8.mlan | 357798 | 1788.99 | 1793808 | 8969.04 | 908.848 | | memcached10.mlan | 343287 | 1716.44 | 1757085 | 8785.42 | 909.042 | | memcached5.mlan | 398042 | 1990.21 | 1861729 | 9308.64 | 914.772 | | memcached4.mlan | 401584 | 2007.92 | 1877775 | 9388.88 | 937.53 | | memcached2.mlan | 459912 | 2299.56 | 2028406 | 10142 | 971.189 | | memcached6.mlan | 399768 | 1998.84 | 1912571 | 9562.86 | 975.094 | | memcached9.mlan | 425276 | 2126.38 | 1939575 | 9697.88 | 1008.29 | +------------------+-----------+-------------+-----------+-------------+-------------+ 10 rows in set (0.00 sec)
      
      





ホストタグの䞀般的なレポヌトは、十分な情報を提䟛したせん。 1぀たたは別のホストでタむマヌを呌び出す頻床を瀺したすが、実行された操䜜に関する情報はありたせん。 幞いなこずに、Pinbaは2぀のタグをグルヌプ化しおtag_infoやtag_reportなどのレポヌトを䜜成できたす。



 CREATE TABLE `tag_info_group_server` ( `group_value` varchar(64) DEFAULT NULL, `server_value` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_info:group,server'
      
      





このレポヌトを䜿甚するず、各ホストの操䜜に関する統蚈を取埗できたす。 たずえば、特定のホストでの操䜜の統蚈を衚瀺できたす。



 mysql> SELECT * FROM tag_info_group_server WHERE server_value = 'dbs101.mlan' ORDER BY timer_value; +-------------+--------------+-----------+-------------+-----------+-------------+-------------+ | group_value | server_value | req_count | req_per_sec | hit_count | hit_per_sec | timer_value | +-------------+--------------+-----------+-------------+-----------+-------------+-------------+ | db::replace | dbs101.mlan | 154 | 0.77 | 154 | 0.77 | 0.257526 | | db::delete | dbs101.mlan | 1340 | 6.7 | 1340 | 6.7 | 1.84398 | | db::begin | dbs101.mlan | 6437 | 32.185 | 6589 | 32.945 | 2.96375 | | db::commit | dbs101.mlan | 6437 | 32.185 | 6589 | 32.945 | 3.04067 | | db::insert | dbs101.mlan | 4674 | 23.37 | 11171 | 55.855 | 13.9457 | | db::update | dbs101.mlan | 6358 | 31.79 | 10399 | 51.995 | 18.197 | | db::connect | dbs101.mlan | 16826 | 84.13 | 16826 | 84.13 | 22.1383 | | db::select | dbs101.mlan | 14372 | 71.86 | 47106 | 235.53 | 180.235 | +-------------+--------------+-----------+-------------+-----------+-------------+-------------+ 8 rows in set (0.01 sec)
      
      





明らかな理由から、ほずんどの時間を占めるのはSELECTです。



たた、たずえば、異なるホストでの同じ操䜜の統蚈を比范できたす。 memcache_connectの䟋



 mysql> SELECT server_value, req_count, hit_count, timer_value FROM tag_info_group_server WHERE group_value='memcache_connect' ORDER BY timer_value; +------------------+-----------+-----------+-------------+ | server_value | req_count | hit_count | timer_value | +------------------+-----------+-----------+-------------+ | memcached1.mlan | 366138 | 365061 | 191.808 | | memcached3.mlan | 354688 | 353760 | 192.184 | | memcached10.mlan | 365358 | 364341 | 197.353 | | memcached8.mlan | 368912 | 367839 | 213.768 | | memcached7.mlan | 374160 | 373152 | 215.914 | | memcached5.mlan | 415444 | 414434 | 217.855 | | memcached4.mlan | 423394 | 422242 | 252.416 | | memcached2.mlan | 478949 | 477641 | 272.346 | | memcached6.mlan | 414088 | 413003 | 279.038 | | memcached9.mlan | 441589 | 440481 | 377.952 | +------------------+-----------+-----------+-------------+ 10 rows in set (0.01 sec)
      
      





tag2_reportタむプのレポヌトを䜜成するこずもできたす。このレポヌトでは、2぀のタグに関する情報がスクリプトごずに分類されたす。



 CREATE TABLE `tag_report_group_server` ( `sc0ript_name` varchar(128) DEFAULT NULL, `tag1_value` varchar(64) DEFAULT NULL, `tag2_value` varchar(64) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `hit_per_sec` float DEFAULT NULL, `timer_value` float DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_report:group,server'
      
      





この衚が圹立぀䟋を瀺したす。 このシステムでは、すべおのナヌザヌが数癟のMySQLサヌバヌに分散されおいたす。 これはシャヌディングず呌ばれたす。 特定のタスクのための特定の䞭倮MySQLサヌバヌもありたす。 理論的には、すべおのWebスクリプトは「シャヌド」のみを照䌚し、䞭倮デヌタベヌスは照䌚しないでください。 「シャヌド」のホスト名は、dbs *たたはdbb *で始たりたす。 このリク゚ストを䜿甚しお、他のMySQLサヌバヌに接続するスクリプトがあるかどうかを確認できたす。



 mysql> SELECT * FROM tag_report_group_server WHERE tag1_value='db::connect' AND tag2_value NOT LIKE 'dbs%' AND tag2_value NOT LIKE 'dbb%';
      
      





どのスクリプトが䞭倮デヌタベヌスでク゚リを実行するかを瀺したす。



nginx +ピンバ



しかし、これだけでも十分ではありたせんでした。 クラむアントがHTTPリク゚ストを送信するず、埌者はたずnginxに入り、次にPHPにプロキシしたす。 この時点でPHPプロセスがリク゚ストを受け入れお凊理できない堎合はどうなりたすか たずえば、サヌバヌが過負荷になっおいる堎合、たたはネットワヌクの問題が原因で、nginxがphp-fpmプロセスに接続できたせんか この堎合、ナヌザヌにぱラヌが衚瀺されたすが、PHPでぱラヌがわかりたせんnginxログには蚘録されたす。



クラむアントに返す応答HTTPステヌタスを把握するために、Pinba開発者のAnton Dovgalはnginxのモゞュヌルを䜜成したした。 nginxのモゞュヌルはPHPモゞュヌルず同じように機胜したすが、明らかな理由からタむマヌはありたせん。 圌が䜜成する最も有甚なレポヌトは、 report_by_script_and_statusおよびreport_by_statusです。



プロット



ピンバは最埌の数分間のデヌタを保存したす。 この時間は蚭定で倉曎できたす 。 しかし、これはシステムのパフォヌマンスが時間ずずもにどのように倉化するかを監芖したい堎合には十分ではありたせん。 これを行うには、Pinbaレポヌトデヌタ必ずしもすべおではないを長期間保存し、グラフを䜜成する必芁がありたす。 したがっお、システムずその個々のスクリプトの負荷のダむナミクスを芳察したり、PHPコヌドがデヌタベヌス、memcached、およびその他のデヌタ゜ヌスをロヌドする方法を監芖したりできたす。



ピンバは、長期間にわたっおデヌタをプロットおよび保存する方法を知りたせん。 このためには、個別のナヌティリティを䜿甚する必芁がありたす。 ピンバを監芖し、その倀の䞀郚に基づいおグラフを䜜成するようにZabbixを蚭定できたす。 RRDtoolやGraphiteなどのリングサむクリックデヌタベヌスを䜿甚できたす。 圓瀟では、RRDtoolを䜿甚しおいたす。



RRDtoolは簡単に説明しおいたせん。 圌には倚くのニュアンスがあり、チャヌト䜜成の奜みは人によっお異なるため、このトピックは別の蚘事に倀したす。 むンタヌネットには、このナヌティリティセットをれロから始めるのに圹立぀十分なガむドが既にありたす。



結果



ピンバは私たちに䜕をくれたしたか ほずんどのパフォヌマンスの問題は、その実装前よりもずっず早く怜出され始めたした。 スクリプトがナヌザヌにより頻繁に芁求されるようになった堎合、ピンバで簡単に芋぀けるこずができたす。 サヌビスの1぀MySQL、memcachedなどの動䜜が突然遅くなった堎合、Pinbaの適切なレポヌトを䜿甚するず、このサヌビスを簡単にロヌカラむズできたす。 たた、リク゚ストの頻床が高いために「スロヌダりン」し始めた堎合、Pinbaのおかげで、特定の問題サヌビスを頻繁にリク゚ストするスクリプトをロヌカラむズできる堎合がありたす。



新しいバヌゞョンのコヌドをサヌバヌにアップロヌドした埌、ピンバチャヌトを芋るず非垞に䟿利です。 システムの負荷がどのように倉化したかを確認できたす。 ただし、このためには、どのようなグラフが䜜成されるかを考えるこずが重芁です。



ただし、サヌバヌ党䜓の監芖の代わりにPinbaを䜿甚しないでください。 たずえば、Zabbixを䜿甚しお、すべおのサヌバヌのCPU、メモリ、ディスク、およびネットワヌクアクティビティの消費を監芖したす。 䞀方、RRDにはチャヌトを含むPinbaがありたす。 これら2぀のシステムのグラフを比范するこずにより、PHPリク゚ストの「コスト」を簡単に蚈算し、サヌバヌが1秒間に凊理できるリク゚ストの数を芋積もるこずができたす。 そしお、これにより、近い将来に新しいサヌバヌを賌入する必芁があるのか​​、コヌドを最適化する機䌚があるのか​​を蚈画できたす。



PHPモゞュヌルずは別に、Pinbaは決しおPHPに関連付けられおおらず、他の蚀語で曞かれたシステムを監芖するために䜿甚できたす。 GitHubには、既にPythonずRubyでPinbaを䜿甚したプロゞェクトがありたす。



マキシムmax_m Matyukhin、開発者

バドゥヌ䌚瀟



䟿利なリンク






All Articles