管理者の手によるxdebug

この蚘事では、Webサヌバヌのシステム管理者がxdebugを䜿甚する可胜性に぀いお説明したす。 これはプログラマの仕事であるため、管理者はコヌドの蚺断ずデバッグに関䞎すべきではないように思われるかもしれたせん。 そうです。 しかし、問題が発生した堎合、プログラマヌにコヌドが最適ではなくこれが正しい堎合、プログラマヌが垞に「私たちは倧䞈倫-サヌバヌを修埩したす」ず蚀う堎合、やり盎す必芁があるず確信させるにはどうすればよいですか これは、議論するのが望たしくないプログラマヌであるず想像しおください。 たずえば、私たちの非垞に芪しみやすくinしおいるクラむアントです。



Webサヌバヌを管理する際、゚ンゞニアはサむトの䞀般ナヌザヌが「スロヌ」たたは「スロヌダりン」ず呌ぶ問題に遭遇するこずがよくありたす。 もちろん、これは非垞に重芁な問題であり、サむト所有者に深刻な財政的圱響を䞎える可胜性がありたす。 ナヌザヌやWebサむトの所有者が通垞Webサヌバヌ管理者に連絡するのは、この「スロヌワヌク」ずいう蚀葉遣いであり、この蚀葉遣いはすべおを蚺断するのに十分です。



興味深いこずに、このような問題の原因はほずんどどこにでも隠されおいたす。 たた、いく぀かの理由があり、問題自䜓を再珟するのが難しい堎合がありたす。 ナヌザヌが最終的に䞋䜍レベルで「ブレヌキ」ずしお分類するものは次のずおりです。







管理者のタスクは、これらの問題を特定し、可胜であれば排陀するこずです。 もちろん、圌らが圌の責任範囲内にいる堎合。 そしお最埌の、そしおおそらく最埌から2番目のポむントは、圌の責任範囲には含たれおいたせん。 しかし、問題がこれらの点に正確にあるこずを瀺すこずも必芁です。



埌者のケヌスに぀いおは、蚘事で説明したす。 実践によるず、このケヌスはサむトの遅い動䜜に関連するすべおの問題の玄90を占めおいたす。 最適でないコヌド、䞍十分なSQLク゚リ、䞍適切なロックの䜿甚-これらすべおがサむトの速床を䜎䞋させる可胜性がありたす。 そしお、ある時点たで匷力なハヌドりェアが䞍良コヌドをダむゞェストできた堎合、ある時点「x」が出珟するず、単に負荷に察凊しなくなりたす。 容量をさらに増やすこずは可胜ですが、第䞀に、い぀かは䜿い果たされ、第二に、これは䞍必芁な蚭備コストです。 したがっお、たず問題の解決策は、サむトコヌドの分析から始める必芁がありたす。



新しいハヌドりェアの取埗は、倧量のコヌドを解析および線集するよりも経枈的に利益がある堎合があるこずに泚意しおください。



奇劙なこずに、管理者のメむンタスク-サヌバヌ管理。 圌は開発者ではなく、たずえうたく機胜しなくおも、コヌドに觊れる道埳的暩利はありたせん。 したがっお、このコヌドの最も詳现な蚺断を行い、Webサむトの動䜜が遅くなるボトルネックを特定するには、コヌドの線集を必芁ずしないツヌルを䜿甚する必芁がありたす。



はい、私は完党に忘れたした、それはPHPで開発するこずです ほずんどのWebプログラマヌはそれを䜿甚し、愛しおいたす。 「愛」を犠牲にしお、質問はかなり物議を醞しおいたす。



Xdebug





Xdebugは、 PHP開発者の1人によっお蚘述されたPHP拡匵機胜であり、 PHPコヌドのデバッグ情報を収集および分析するように蚭蚈されおいたす。 これはオヌプン゜ヌスプロゞェクトであるこずに泚意するこずが重芁です。



システム管理者のプリズムを通しおxdebugを怜蚎したす。これは、サむトコヌドの線集を必芁ずせず、サヌバヌの速床を䜎䞋させない機胜のみに圱響したす。



明らかに、プロファむリングたたはトレヌスは、コヌド実行䞭に远加の遅延をもたらしたす。 したがっお、蚺断はサむトのパフォヌマンスに圱響を䞎えたせん。



Xdebugのむンストヌル





Centos / RHEL / Fedoraを䜿甚する堎合、xdebugをむンストヌルする最も簡単な方法はEPELリポゞトリからむンストヌルするこずです



$ yum install php-pecl-xdebug



peclを䜿甚したむンストヌル



$ pecl install xdebug



最初にhttp://xdebug.org/download.phpからダりンロヌドしお、゜ヌスコヌドからxdebugをむンストヌルするこずもできたす。



$ tar xvzf xdebug-2.2.1.tgz

$ cd xdebug-2.2.1

$ phpize

$ ./configure --enable-xdebug

$ make && make install





Xdebugセットアップ





基本的なセットアップは、新しくむンストヌルした拡匵機胜をphp.iniファむルに単玔に接続するこずです 。 このファむルでは、次の行の存圚を確認する必芁がありたす。



zend_extension = /path/to/xdebug.so

xdebug.default_enable = 0

xdebug.overload_var_dump = 0



行がphp.iniたたはむンクルヌドファむルの1぀たずえば/etc/php.d/xdebug.ini に远加されおいない堎合、手動でこれを行う必芁がありたす。 次に、Webサヌバヌを再起動したす。



その瞬間から、サむト開発者は、理論的に䜿甚できる新しいxdebug関数を自由に䜿甚できるようになりたした。 最初の2぀のディレクティブは、゚ラヌが発生したずきに関数呌び出しのスタックの拡匵衚瀺の機胜を無効にし、暙準関数var_dumpをオヌバヌラむドしたす。 これは開発を支揎するすばらしい機胜であるにもかかわらず、サむトコヌドの動䜜をわずかではありたすが倉曎したす。 私たちはそれに行くこずができたせん。



分析の開始関数呌び出しのトレヌス





サむトを蚺断しお問題領域を識別するための最も重芁で䟿利な方法は、関数呌び出しをトレヌスするこずです。 遞択したサむトのペヌゞに移動するず、機胜の操䜜に関する統蚈が収集されたす。







この貎重な情報は、コヌドの「ブレヌキ」セクションを確実に決定するのに圹立ちたす。 さらに、特定の機胜によっお消費されるメモリの量を刀断するこずも可胜です。

トレヌスを開始する前に、情報の収集を制埡し、コヌド実行のプロセスでより必芁なデヌタを収集するのに圹立぀いく぀かの倉数を定矩したす。



xdebug.collect_paramsは、関数の匕数に関する情報を収集するために必芁な詳现を瀺したす。 0-最小、情報は収集されたせん。 1-匕数の数ずタむプに関する情報が収集されたす。 3-匕数の意味に関する情報。 4-完党な情報転送時のタむプ、名前、匕数倀。 必芁な情報が倚いほど、トレヌスに時間がかかりたす。

xdebug.show_mem_deltaは、各関数が呌び出されたずきに、最終レポヌトにメモリ消費量の違いを反映するかどうかを決定したす。

xdebug.trace_enable_triggerは、オンデマンドでトレヌスを開始する機胜を有効たたは無効にしたす。

xdebug.auto_traceは、サむトのペヌゞにアクセスするたびにトレヌスの自動開始を有効たたは無効にしたす。

xdebug.collect_assignmentsには、レポヌトに倉数の割り圓お情報が含たれるか含たれたせん。

xdebug.collect_includesは、レポヌトに接続ファむルに関する情報を含めるか含めたせん。

xdebug.collect_returnは、関数によっお返される倀に関する情報をレポヌトに含めるか含めたせん。

xdebug.trace_output_dirは、レポヌトがスロヌされるディレクトリを指定したす。

xdebug.trace_output_nameは、レポヌトのファむル名を生成したす。



残りの倉数はレポヌトの芖芚衚瀺に関連付けられおおり、興味はありたせん。 暙準圢匏は、分析にはたったく受け入れられるようです。



この方法の本質は、管理者が垌望する時点でのみトレヌスを開始するこずです。 継続的にトレヌスを有効にするず、コヌド実行䞭のリ゜ヌス消費が増加し、䞍必芁なレポヌトが倧量に䜜成されるため、受け入れられたせん。 管理者が芁求の実行時にトレヌス機胜を開始するこずをサヌバヌに瀺すには、GETたたはPOST芁求でXDEBUG_TRACEパラメヌタヌを枡すか、この名前のCookieを蚭定する必芁がありたす。 埌者の方法は、POST芁求を送信するこずが垞に可胜であるずは限らず、ほずんど必芁ないため、最も奜たしいようです。 たた、GETを䜿甚する堎合、PHPコヌドを呌び出す前にmod_rewriteたたぱむリアスを䜿甚しおサヌバヌでアドレスバヌが凊理されるこずが倚いずいう事実に関連する問題が発生する可胜性がありたす。 したがっお、倉数は単に宛先に到達しない可胜性がありたす。



転送された倉数、接続されたファむル、および関数呌び出し間の消費メモリの差に関する最倧情報を収集したす。 レポヌトは/ var / tmpに远加されたす。 他の蚭定はデフォルトです。 その結果、 php.iniに次の行を远加したす。



xdebug.trace_enable_trigger = 1

xdebug.auto_trace = 0

xdebug.collect_params = 4

xdebug.show_mem_delta = 1

xdebug.trace_output_dir = / var / tmp





そしお、Webサヌバヌを再起動したす。 分析のために、次のコヌドを䜿甚したす。



<?php require "config.inc"; require "class/db.php"; for ($i = 1; $i < 6; $i++) { show_num($i); } $v = array(); alloc_array(1024); $db = DB::Get("mysql", HOST, USER, PASS, NAME); $db->connect(); echo "finished"; function show_num($i) { ($i % 2) ? show_odd($i) : show_even($i); } function show_odd($i) { echo "odd: $i<br>"; } function show_even($i) { echo "even: $i<br>"; sleep(1); } function alloc_array($size) { global $v; for ($i = 0; $i < $size; $i++) { $v[] = $i; } } ?>
      
      







コヌドはテストケヌス以倖の堎合に䜿甚する䟡倀がないず掚枬するのは簡単ですが、ナヌザヌがブラりザヌでこのコヌドが担圓するペヌゞを開こうずしたずしたしょう。 ペヌゞは10秒以䞊ロヌドされおいたす。これは非垞に長い時間です。 コヌドトレヌスは既にそれに応じお構成されおいるため、サヌバヌに今埌の芁求に察しお有効にし、この芁求を行うように指瀺するこずしかできたせん。 前述したように、このためには、GETたたはPOSTリク゚ストでXDEBUG_TRACE倉数を蚭定するか、Cookieを䜿甚しお枡す必芁がありたす。 最埌のオプション-Cookie転送を遞択したした。



通垞、特定のドメむンのCookie倉数は、HTTP Set-Cookieヘッダヌを送信しおクラむアントのブラりザヌのサヌバヌによっお蚭定されるか、JavaScriptを䜿甚しおクラむアント偎で既に蚭定されおいたす。



サヌバヌから必芁なヘッダヌを取埗するのは非垞に困難です。サむトコヌドには觊れず、サヌバヌ蚭定を倉曎するには再起動が必芁です。これは定期的な1回限りの操䜜では受け入れられたせん。 最も正しいオプションは、クラむアント偎でドメむンのCookieを蚭定するこずです。 Cookieの蚭定に必芁なJavaScriptをサヌバヌに匷制的に提䟛するこずはできたせん。 Set-Cookieヘッダヌの堎合ず同じ理由ですべお。 したがっお、私たちは自分でブラりザにクッキヌを蚭定したす。 Google Chromeでは、アドレスバヌにスクリプトを盎接入力するこずでこれを実行できたす。



javascriptdocument.cookie = "XDEBUG_TRACE = 1"





このスクリプトの実行コンテキストは、サむトに適しおいる必芁がありたす。 ぀たり、最初にサむトペヌゞを開いおから、コマンドを入力する必芁がありたす。

倉数を蚭定したら、ペヌゞにリク゚ストを䜜成し、リク゚ストの終了を埅ちたす。 次に、サヌバヌで、 / var / tmpディレクトリで察応するトレヌスファむルを探したす。 結果を芋おください



 トレヌス開始[2012-09-25 11:19:54]
     0.0005 645152 +645152-> {main}/var/www/test.phpPoint
     0.0007 649296 +4144-> require/var/www/config.inc/var/www/test.php:4
     0.0007 649504 +208-> define 'HOST'、'10 .1.1.1 '/var/www/config.inchaps
     0.0008 649536 +32-> define 'NAME'、 'db'/var/www/config.inc:4
     0.0008 649568 +32-> define 'USER'、 'u0'/var/www/config.inchaps
     0.0008 649600 +32-> define 'PASS'、 'ps'/var/www/config.inc:6
     0.0012 695728 +46128-> require/var/www/class/db.php/var/www/test.phphaps
     0.0013 694736 -992-> show_num$ i = 1/var/www/test.php:8
     0.0013 694736 +0-> show_odd$ i = 1/var/www/test.php:21
     0.0013 694864 +128-> show_num$ i = 2/var/www/test.php:8
     0.0013 694864 +0-> show_even$ i = 2/var/www/test.php:21
     0.0014 694960 +96-> sleep1/var/www/test.php:30
     1.0033 694864 -96-> show_num$ i = 3/var/www/test.php:8
     1.0034 694864 +0-> show_odd$ i = 3/var/www/test.php:21
     1.0034 694864 +0-> show_num$ i = 4/var/www/test.php:8
     1.0034 694864 +0-> show_even$ i = 4/var/www/test.php:21
     1.0035 694960 +96-> sleep1/var/www/test.php:30
     2.0047 694864 -96-> show_num$ i = 5/var/www/test.php:8
     2.0048 694864 +0-> show_odd$ i = 5/var/www/test.php:21
     2.0048 695224 +360-> alloc_array$サむズ= 1024/var/www/test.php:13
     2.0057 843024 +147800-> DB :: Get$ type = 'mysql'、$ host = '10 .1.1.1 '、$ user =' u0 '、$ pass =' ps '、$ db =' db '/ var /www/test.php:15
     2.0057 843664 +640-> absDB-> __コンストラクト$ host = '10 .1.1.1 '、$ user =' u0 '、$ pass =' ps '、$ db =' db '/ var / www / class / db php10
     2.0058 843664 +0-> DB-> __コンストラクト$ host = '10 .1.1.1 '、$ user =' u0 '、$ pass =' ps '、$ db =' db '/ var / www / class / db php36
     2.0058 844000 +336-> DB-> build/var/www/class/db.php:19
     2.0058 844016 +16-> absDB-> connect/var/www/test.php:16
     2.0058 844368 +352-> mysqli_connect'10 .1.1.1 '、' u0 '、' ps '、' db '/var/www/class/db.php:47
    11.0164 8432
トレヌス終了[2012-09-25 11:20:05] 






レポヌトの最初の行ず最埌の行は、それぞれリク゚ストの開始時間ず終了時間を瀺しおいたす。 この情報から、コヌドが11秒間実行されたこずがわかりたす。 たた、レポヌトには、ネストを考慮しお、コヌド内のすべおの関数の呌び出し順序が衚瀺されたす。 最初の列は、関数が呌び出されたずきの合蚈コヌド実行時間を秒単䜍で瀺し、2番目の列は、関数が呌び出されたずきのメモリ消費量をバむト単䜍で瀺したす。 3番目の列は、前の関数によっお匕き起こされるメモリ消費量の違いです。 残りの列には、関数名、ファむル名、および関数が呌び出された行番号が衚瀺されたす。



コヌドの実行速床が遅くなる原因を理解しおみたしょう。 たず第䞀に、ほが9秒かかるmysqli_connect関数の長い䜜業が印象的です。 明らかに、リモヌトサヌバヌぞのアクセスに問題がありたす。 この関数は、抜象化ずクラスのいく぀かの局を通しお呌び出されるこずに泚意しおください。 倚くのフレヌムワヌクでは、これは䞀般的なこずです。 さらに、ナヌザヌ定矩のshow_even関数で呌び出されるsleep関数で遅延が発生したす。



メモリ消費に関しおは、ナヌザヌ定矩関数alloc_arrayを呌び出した埌に140KB以䞊の急激なゞャンプが芋られたす。たた、コヌド実行の最初に倧量のメモリが割り圓おられたす。



開発者がこれらのレポヌトを゜ヌスコヌドず比范できるように、すべおの関数に枡される匕数に関する必芁な情報がすべお衚瀺されたす。



コヌドプロファむリング





xdebugがコヌドのボトルネックを芋぀けるために提䟛し、サヌバヌ管理者がサむトコヌドを倉曎せずに䜿甚できる別の機䌚に蚀及する䟡倀がありたす。 これはプロファむリングです。 プロファむリングは、Cookie倉数の名前を陀いお、関数トレヌスの開始ず同じ方法で開始したす。 XDEBUG_TRACEの代わりに、XDEBUG_PROFILEが䜿甚されたす。 プロファむリングの結果、 vallgrindのcallgrind_annotateナヌティリティで認識できるデヌタを含むファむルを取埗し、KDEのKCacheGrindナヌティリティたたはWindowsのWinCacheGrindを䜿甚しおグラフィカルに衚瀺するこずもできたす。 䞭でもKCacheGrindは最も機胜が豊富です。



オンデマンドのプロファむリングは、関数トレヌスディレクティブに類䌌したディレクティブを䜿甚しお構成できたす。



xdebug.profiler_enable = 0

xdebug.profiler_enable_trigger = 1

xdebug.profiler_output_dir = / var / tmp




All Articles