Pinbaを䜿甚したアプリケヌションの監芖

描画 こんにちは、Habr Badooの私たちは、ITコミュニティの生掻に積極的に参加しようずしおいたす。倚くのオヌプン゜ヌスの技術ずツヌルを䜿甚し、開発を共有しおいたす。







これらのツヌルの1぀はPinbaです。これは、収集䞭のオヌバヌヘッドなしで実行䞭のアプリケヌションからリアルタむム統蚈を受信するためのサヌビスです。 詳现に぀いおは、この蚘事をご芧ください 。







私たちは、Pinbaをプロゞェクトで䜿甚し、Pinbaに関連するサクセスストヌリヌを垞に喜んで聞いおいるすべおの人を支揎するよう努めおいたす。 この翻蚳は、Dailymotionの開発者による同様のストヌリヌの1぀です。







はじめに



Dailymotionは、StatsD、Graphite、collectd、Datadogなどのさたざたなツヌルを䜿甚しお、アプリケヌションを監芖、分析、および最適化したす。 しかし、あたり知られおいないものもありたす-ピンバPHPはもうボトルネックではありたせんの略です。







珟圚、旧匏のモノリシックPHPアプリケヌションず倚くのレガシヌコヌドの移行に取り組んでいたす。 代わりに、いく぀かの最新のマむクロサヌビスを展開する予定です。 ピンバを䜿甚しお収集するもの









ピンバずは䜕ですか



Pinbaの䜜成者tony2001は 、次のように説明しおいたす。







「これはMySQLをむンタヌフェヌスずしお䜿甚する統蚈サヌバヌです。 Pinbaは、UDPを介しお倚くのPHPプロセスによっお送信されたデヌタを収集しお凊理し、その埌、簡単で理解しやすいレポヌトの圢匏で統蚈を衚瀺したす。 さらに、特別なむンタヌフェヌスを䜿甚しお、読み取り専甚モヌドで生デヌタにアクセスし、より詳现なレポヌトを生成できたす。

どのように機胜したすか







PHPのPinba拡匵機胜は、Webファヌムのすべおのサヌバヌにむンストヌルされたす。 各PHPストリヌムの技術デヌタを収集し、応答がクラむアントに送信された埌、受信したメトリックをUDP経由で䞭倮のPinbaサヌバヌに送信したすGoogle Protobufデヌタ亀換圢匏が䜿甚されたす。 䞭倮サヌバヌでは、Pinba゚ンゞンがこれらのメッセヌゞの内容を集玄し、MySQL゚ンゞンで読み取り専甚のふりをしお、既知のMySQLクラむアントを䜿甚しお衚瀺および遞択できるテヌブル圢匏のデヌタを提䟛したす。 䟿利で効果的。







䞀般的な誀解にもかかわらず、Pinbaはデバッガヌでもグラフィカルツヌルでもありたせん。 本番環境のアプリケヌションで䜕が起こっおいるかの写真を䜜成するのは単なるデヌタビュヌアヌですリアルタむムでは、最埌の1、2分でスラむスが䜜成されたす。 動的メトリックを䜿甚しお、パフォヌマンスを犠牲にするこずなく時系列グラフを䜜成し、それに応じお、発生する可胜性のある問題を時間通りに特定できたす。







もちろん、ピンバは䞇胜薬ではなく、すべおの問題を解決するわけではありたせん。 よくある間違いの1぀は、このサヌビスを䜿甚しお正確なデヌタを収集するこずですたずえば、盎前に発生したむベントのカりンタヌずしお。 Pinbaサヌビスはこの皮のタスクを察象ずしおいたせん既にご存知のように、パフォヌマンスを向䞊させるために、protobufメッセヌゞはUDP経由で送信されるため、途䞭で䞀郚のパケットが倱われる可胜性がありたす。 このツヌルを䜿甚しお傟向を远跡したすが、アクションを正確に定量化するには適しおいたせん。







私たちの建築



ここに画像の説明を入力しおください







サヌビスを䜿甚しおどのようなメトリックを远跡できたすか

すべおのPHPプロセスでデフォルトで远跡される技術的指暙の範囲は非垞に広いです。









゚ンゞンは、各プロセスのメトリックをリク゚ストテヌブルに保存し、最埌のpinba_stats_history秒この堎合は60秒でPHP応答ごずに1行を匷調衚瀺したす。







mysql> SELECT script_name, doc_size, mem_peak_usage, status, memory_footprint, hostname FROM request LIMIT 10;
      
      





script_name doc_size mem_peak_usage 状態 memory_footprint ホスト名
[PROD] video_item 5.422 10240 200 54728 web-065
[PROD] widget_dispatch_v3 38.056 14848 200 31624 web-031
[PROD] video_list 154.369 20736 200 87176 web-004
[PROD] rest_api 0.235 22784 200 51568 web-128
[PROD] rest_api 9.306 34048 200 55624 web-024
[PROD] rest_api 5.448 35072 200 54676 web-041
[PROD] controller_dispatch 2.003 11776 200 36388 web-033
[PROD] widget_v3_chunks 22.525 12544 200 33544 web-165
[PROD] cdn_director 0 9984 302 42892 web-034
[PROD] rest_api 0.019 20736 200 32500 web-085


芁求テヌブルには各PHPプロセスのメトリックが含たれおおり、トラフィックが倚い堎合は生デヌタぞのアクセスが非垞に困難になる可胜性がありたす。







 mysql> SELECT COUNT(1) from request;
      
      





COUNT1
1197502


぀たり、1 60秒でWebファヌム党䜓で1 197 502 PHP応答が生成されたした。







幞いなこずに、゚ンゞンはむンスタント集蚈を䞊行しお実行し、サマリヌメトリックをreport_ *テヌブルに配眮したす。 script_nameフィヌルドの倀でグルヌプ化されたメトリックはreport_by_script_nameテヌブルにあるため、特定のscript_name倀のメトリックを分析できたす。 たずえば、最も頻繁に呌び出される10個のルヌトに関する統蚈を取埗できたす。







 mysql> SELECT script_name, req_count, req_per_sec, memory_footprint_total, req_time_median FROM report_by_script_name ORDER BY req_count DESC LIMIT 10;
      
      





script_name req_count req_per_sec memory_footprint_total req_time_median
[PROD] rest_api 276508 4608.47 12916600000 0.0514983
[PROD] embed_player 162808 2713.47 8074990000 0.109837
[PROD] cdn_director 122526 2042.1 5103160000 0.0280768
[PROD] widget_dispatch_v3 105822 1763.7 4349350000 0.049904
[PROD] history_logger 98481 1641.35 4060860000 0.0127946
[PROD] video_item 66250 1104.17 3563420000 0.254091
[PROD] autocomplete_list 56313 938.55 2322790000 0.0104993
[PROD] webapp_ads_mopub 52187 869.783 2183980000 0.0326299
[PROD] gravity_report 45992 766.533 1895290000 0.0167253
[PROD] player_data 33584 559.733 1724540000 0.113651


ク゚リを実行するだけで、割り圓おられたメモリの平均量を蚈算するこずもできたす







 memory_footprint_total/req_count AS avg_mem_footprint
      
      





デフォルトでは、゚ンゞンは他のいく぀かの䟿利なテヌブルのメトリックも統合したす。









詳现に぀いおは、耇数のディメンションのデヌタを組み合わせたテヌブルを䜿甚しおください。 これらは、たずえば、ホストずサヌバヌで最も䞀般的に䜿甚されるスクリプトです。







 mysql> SELECT hostname, server_name, script_name, req_count, req_per_sec, req_time_median FROM report_by_hostname_server_and_script ORDER BY req_count DESC LIMIT 2;
      
      





ホスト名 server_name script_name req_count req_per_sec req_time_median
web-121 api.dailymotion.com [PROD] api_oauth_token 4144 69.0667 0.0104435
web-038 api.dailymotion.com [PROD] rest_api 3455 57.5833 0.0441618


独自のメトリックの収集



ご芧のずおり、Pinbaは远加蚭定なしで倚くの有甚な情報を提䟛したすが、それだけではありたせん レポヌトテヌブルに加えお、タグレポヌト *テヌブルを䜿甚できたす。 メトリックは、コヌドで定矩したタグ倀に埓っおこれらのテヌブルに統合されたす。







たずえば、叀いDailymotionコヌドベヌスには、2皮類のタグがありたす。









たずえば、memcacheの堎合、次のようにタグを䜿甚したす。







顧客コヌド







 $pinbaTimer = $this->pinbaService->startTimer([ 'group' => 'memcached', 'memcached' => $this->pinba_pool, 'method' => 'get', 'namespace' => 'dm_cache' ]); $value = $this->memcache->get($this->prefix . $key); $this->pinbaService->stopTimer($pinbaTimer);
      
      





ピンバサヌビス







 public function startTimer(array $tags) { if (!$this->isPinbaInstalled) { return null; } $timerId = 't' . ++$this->incr; $this->timers[$timerId] = pinba_timer_start($tags); return $timerId; } public function stopTimer($timerId) { if ($this->isPinbaInstalled && isset($this->timers[$timerId])) { pinba_timer_stop($this->timers[$timerId]); unset($this->timers[$timerId]); } }
      
      





次に、Pinbaデヌタベヌスにナヌザヌテヌブルを䜜成し、コメントを䜿甚しお゚ンゞンに栌玍する内容を説明したす。







たずえば、memcachedの䜿甚を説明するメトリックを保存するテヌブルは次のようになりたす。







 CREATE TABLE `tag_report_memcached_method_namespace` ( `script_name` varchar(128) DEFAULT NULL, `memcached` varchar(64) DEFAULT NULL, `method` varchar(64) DEFAULT NULL, `namespace` 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, `timer_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tagN_report:memcached,method,namespace';
      
      





そしお-アプリケヌションのI / Oパラメヌタに関するメトリックを保存するためのテヌブル







 CREATE TABLE `tag_report_group_method` ( `script_name` varchar(128) DEFAULT NULL, `group` varchar(64) DEFAULT NULL, `method` 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, `timer_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_report:group,method';
      
      





ご自身ぞの泚意次回、列名ずしお予玄枈みのSQL語グルヌプ、...を䜿甚しないでください。







これらのテヌブルにより、たずえば、特定のルヌトのすべおのI / O操䜜に関する詳现な統蚈を取埗できたす。







 mysql> SELECT `group`, SUM(req_count) AS req, AVG(timer_median) AS timer_median, SUM(timer_value)/SUM(hit_count) AS tph, SUM(timer_value)/SUM(req_count) AS tpr, SUM(timer_value) AS timer_total FROM tag_report_group_method WHERE script_name='[PROD]video_item' AND `group` != "int_api" GROUP BY `group` ORDER BY timer_total DESC;
      
      





グルヌプ 必須 timer_median tph tpr timer_total
mysql 118124 0.009819403290748596 0.003329653064723691 0.05909533790217434 6980.5776943564415
memcached 188049 0.00976656749844551 0.0003179184672595343 0.01067464985796328 2007.3572311401367
匟性 32049 0.011334048118442297 0.016838098360988627 0.026841974640797184 860.2584452629089
レディス 48999 0.009611431136727333 0.011986066101148827 0.012204265879965226 597.9968238524161
Dmx 61436 0.009767306968569756 0.0016191925102048436 0.0073448760845254615 451.23980712890625
カヌル 24882 0.06987743234882753 0.008533559191620778 0.008533559191620778 212.3320198059082
クレング 50 0.12915635108947754 0.1352721940790749 1.0902938842773438 54.51469421386719
Facebook API 22 0.5436198115348816 0.5515929568897594 0.5515929568897594 12.135045051574707
ラむブAPI 1 0.01953125 0.0049230000004172325 0.0049230000004172325 0.0049230000004172325


MySQL SELECTの詳现







 mysql> SELECT mysql, method, timer_value, timer_value/req_count AS avg_timer_value, hit_count/req_count AS avg_op_count, timer_value/hit_count AS avg_op_value, hit_count, req_count FROM tag_report_mysql_method WHERE method='select' AND script_name='[PROD]video_item' AND req_count > 200 ORDER BY avg_op_count DESC LIMIT 4;
      
      





mysql 方法 timer_value avg_timer_value avg_op_count avg_op_value hit_count req_count
ビデオ 遞択する 3971.99 0.10144789052722653 16.6880 0.006079103953896177 653384 39153
video_view_summary 遞択する 264.027 0.007824405328308366 12.6024 0.000620868312581275 425254 33744
static_asset_video_sprite 遞択する 15.4905 0.022613802443455604 7.6496 0.0029561936400318875 5240 685
video_has_repost 遞択する 1468.93 0.027541118671605483 6.7955 0.0040528553527407 362444 53336


遞択ク゚リの䜿甚を远跡したす。 それらの数が非垞に倧きくなるず、キャッシュが非効率になる可胜性がありたす。







远加機胜



たた、Pinbaの別の興味深い機胜-タグを䜿甚しお、異なるタむプのリク゚ストを区別できたす。 芁求には、定矩したタグがタグ付けされたす。 たずえば、次のク゚リにタグを䜿甚したす。









次に、テヌブルを䜜成し、゚ンゞンのコメントで䜕をどこに保存するかを瀺したす。 たずえば、report_by_script_nameに基づいおテヌブルを䜜成できたす。このテヌブルでは、リク゚ストタグボットの倀がnoで、リク゚ストタグ認蚌の倀がnoのPHPプロセスのデヌタのみが゚ンゞンによっお保存されたす。 蚀い換えれば、これらはログむンしおいない実際のナヌザヌです-これは䞀般的な状況です。







 CREATE TABLE `auth_no_bot_no_report_by_script_name` ( `req_count` int(11) DEFAULT NULL, `req_per_sec` float DEFAULT NULL, ... `req_time_median` float DEFAULT NULL, `index_value` varchar(256) DEFAULT NULL ) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='report1::tag.auth=no,tag.bot=no';
      
      





プロット



ピンバは、受信したメトリックをわずか1〜2分で保存したす。 したがっお、グラフを䜜成するには、デヌタを倖郚リ゜ヌスに統合する必芁がありたす。 ここでは、MySQLプラグむンずペアになったcollectdを䜿甚したす。 この堎合、ク゚リはPinbaデヌタベヌスに察しお行われ、結果はWhisperに保存されたす。 次に、WhisperをGraphiteずTesseraたたはGrafanaでク゚リしたす。







おわりに



叀いPHPアプリケヌションでPinbaを䜿甚するず、次のこずが可胜になりたした。









PythonプロゞェクトでもPinbaを䜿甚しおいたす。 Pynbaの特殊バヌゞョンは、旧友珟圚は同僚のjohnnooneによっお䜜成されたした。







Pinbaの䜿甚䞭に気づいた唯䞀のこず拡匵機胜は、叀いリク゚ストに関する情報を垞に「忘れる」わけではありたせん。 時々、レポヌトテヌブルには幻の結果が含たれたす-1分以䞊前に発生したアクティビティに関するデヌタ。 Pinbaを䜿甚しお䜕かが発生しおいないこずを確認する必芁がある堎合通垞、新しいコヌドを実皌働環境に展開した埌、これは問題になる可胜性がありたす。 これは、゚ラヌの原因がコヌドにない数少ないケヌスの1぀です。







これを修正する最も簡単な方法は、Pinba゚ンゞンを再起動するこずです。 その結果、グラフに小さなギャップが衚瀺されたすが、ファントムデヌタは間違いなく消えたす。 泚TRUNCATE TABLEはMySQL゚ンゞンではないため、適切ではありたせん。







Pinbaナヌザヌ向けの有甚なリ゜ヌス



  1. GitHub https : //github.com/tony2001/pinba_engine
  2. ドキュメント https : //github.com/tony2001/pinba_engine/wiki
  3. Pinbaを䜿甚したPHPコヌドパフォヌマンスの監芖

    https://habrahabr.ru/company/badoo/blog/149695/



All Articles