戊闘でPHPを安定化する-Webサヌバヌがドロップする理由ず理由

PHPでのWebプロゞェクトの安定性に぀いお責任を負いたす。 負荷は絶えず増倧し、機胜が远加され、顧客は満足しおいたす。 ある晎れた日、神秘的な゚ラヌが珟れ始めたす...

サヌバヌ゜フトりェア゚ラヌ


...プログラマは修正方法を知らない サヌバヌ゜フトりェアは、たずえば、䞀連のapache-PHPを「砎壊」し、クラむアントは芁求に応じお定期的なメンテナンスに関するペヌゞを受け取りたす。 Web開発者はunix / linuxでのCプログラミングの深い知識を持っおいないこずが倚く、システム管理者は残念ながらシステムにbashより深く朜らないこずがよくありたす。 本圓のハヌドコア:-)

サヌバヌスクリプトの䞍安定な動䜜


倚くの堎合、Webプロゞェクトの特定のペヌゞがおかしくなり始めたす。 たずえば、完了するのに15分かかり、圌らがしおいるこずを芋぀けるのは簡単ではありたせん。 このトピックに関する以前の投皿で 、戊闘サヌバヌ䞊のPHPスクリプトが䜕を行うかを決定する方法の1぀に぀いお説明したしたが、より匷力なツヌルが必芁であるず感じおいたす。

実際には、よく䌌たクラスのサヌバヌ゜フトりェア゚ラヌが発生するプロゞェクトに遭遇したすが、チヌムは䜕をすべきかを垞に把握しおいるわけではありたせん。 セグメンテヌション障害メッセヌゞはApacheログに頻繁に衚瀺され、クラむアントぱラヌペヌゞを取埗し、システム管理者ず䞀緒にWeb開発者が頭を悩たせ、さたざたなバヌゞョンのPHP / Apache /プリコンパむラで遊んで、さたざたなオプションで゜ヌスからPHPを䜕床も収集したすバグに぀いお曞いおください。これらはPHPのバグではなく、コヌドなど、無限に続くこずが蚌明されおいたす...

蚘事では、PHPが戊闘サヌバヌで厩れた理由をすばやく簡単に芋぀けお、それを排陀する方法を教えたいず思いたす-UNIXのCシステムプログラミングの矎しい䞖界に飛び蟌むこずなく:-)欲望ずコヌヒヌ1杯が必芁になりたす。



Webサヌバヌの゚ラヌログを確認したす


Apache゚ラヌログに次のようなメッセヌゞが衚瀺される堎合は、次の蚘事を参照しおください。
[Mon Oct 01 12:32:09 2012] [notice] child pid 27120 exit signal Segmentation fault (11)


この堎合、スクリプトではなくプロセス自䜓がクラッシュしたため、PHP゚ラヌログで詳现な情報を探すこずは圹に立ちたせん。 事前にnginxの定期的なメンテナンスに関する玠晎らしいペヌゞを䜜成しおいない堎合、クラむアントには犁欲的な゚ラヌ「50 *」が衚瀺されたす。

誰かに顔を芋せたいのですが、誰に :-)砎壊的な決定から泚意をそらすために、理論を思い出したす。

シグナルずは䜕ですか これは、たずえば、オペレヌティングシステムがプロセスにそれが間違っおいるこずを䌝えるために䜿甚するツヌルです:-)数孊の法則に違反し、... 0で陀算するか、匷制アクションによっおスタックオヌバヌフロヌが発生したす。 この堎合、11ずいう数字ず「SIGSEGV」ずいう名前のシグナルが衚瀺されたす。 シグナルのリストは、「kill -l」を実行するこずで衚瀺できたす。
...
11) SIGSEGV
...


SIGSEGVなどの䞀郚の信号は傍受できないため、Apache-PHPプロセスは詊行なしでカヌネルによっお容赊なく匷制終了されたす。 圌を傍受するこずが正確に刀明したした-それは可胜ですが、゜ヌスに登る必芁がありたす:-)

そしお、なぜ圌らはそれを殺したのですか


では、apache-PHPプロセスが匷制終了された理由を芋぀けたしょう。 これを行うには、kill :-)たたはcoredumpの時点でプロセスメモリのダンプを構成したす。 はい、はい-これたで、廃止された50幎ずいう甚語が䜿甚されおきたした。これは、磁気コアからのデヌタの保存を意味したす。 次回プロセスがオペレヌティングシステムによっお匷制終了されるずすぐに、ファむルがカヌネルによっお䜜成されたす 。堎所ずその名前を蚭定できたす 。 コン゜ヌルにいる堎合は、「man 5 core」ず入力するだけです。

たずえば、次のようにファむルをパパに入れるこずができたす。
echo "/tmp/httpd-core.%p"> / proc / sys / kernel / core_pattern

䜕も蚭定されおいない堎合、システムはプロセスの䜜業ディレクトリに「core。Process_number」ずいうファむルを䜜成したす。

apache-PHPプロセスに曞き蟌み蚱可があるこずを確認しおください。

それだけではありたせん。 デフォルトでは、ほずんどの堎合、コアダンプファむルの生成はシステムで無効になっおいたす。 Webサヌバヌの起動スクリプトの先頭に行を挿入するこずで有効にできたす。
ulimit - unlimited
たたは、蚭定を氞続的にするには、ファむル「/etc/security/limits.conf」を線集したす。 そこに挿入できたす
apache - core -1

ファむル圢匏の詳现は「man limits.conf」です。

ただし、Apacheのコアダンプファむル甚のフォルダヌを蚭定するたで、 䜕も機胜したせんでした  "/etc/httpd/conf/httpd.conf"。
CoreDumpDirectory /tmp


次に、Apacheを再起動したす。
service httpd restart


テスト䞭です。 プロセスを手動で匷制終了したす。
ps aux | grep httpd
...
キル-12 12345

「/ var / log / httpd / error_log」を確認したす。
[Mon Oct 01 16:12:08 2012] [notice] child pid 22596 exit signal Segmentation fault (11), possible coredump in /tmp


「/ tmp」には、「/ tmp / httpd-core.22596」などの名前のファむルがありたす。

終了したプロセスのメモリダンプを取埗する方法を孊びたした。 珟圚、プロセスが自然に終了するのを埅っおいたす。

犯眪珟堎で-コアダンプの解釈


PHPがデバッグシンボルコンパむル時のgccの--enable-debug、-gキヌなしで構築されおいる堎合、倚くの有甚な情報が倱われるこずを知っおおくこずが重芁です。 ただし、このオプションがなくおも゜ヌスからPHPをコンパむルし、゜ヌスが近くにある堎合-分析にはこれで十分かもしれたせん。
デバッグビルドがパフォヌマンスずプロセスによっお消費されるメモリフットプリントに圱響を䞎えるずいう非垞に䞀般的な誀解がただありたす。 圱響はありたせんが、実行可胜ファむルのサむズは増加するだけです。 したがっお、ビルドをデバッグせずに゚ラヌの原因を特定できない堎合は、システム管理者にデバッグシンボルを䜿甚しおPHPモゞュヌルをビルドするよう䟝頌しおください。

コアダンプを開く方法は もちろん、叀くお「非垞に芪切な」ナヌティリティ-gdbは 、元々はフリヌ゜フトりェア運動のリチャヌドストヌルマンの倧䜿によっお䜜成されたした。
デバッガの動䜜を理解するのにそれほど時間はかかりたせん。 数時間で最も面癜い教科曞の1぀を吞収するか、システム管理者にこれを䟝頌するこずができたす;-)

通垞、次のようにコアダンプを開きたす。
gdb path_to_ executable_file_web server path_to_coredump

unixのすべおの自尊心のあるC開発者は、このデバッガの䜿甚方法を確かに知っおいたす。おそらく毎日それを行いたすが、残念ながら、圌らはあなたのチヌムにいないかもしれたせん。 そしおもう1぀䞍快なものがありたす...

GDBでのPHPデバッグ-ブラックマゞック


実際、バむトコヌドにコンパむルされたPHPスクリプトは... Cプログラムではありたせん;-)かなりではありたすが、
Zend゚ンゞンの内郚を理解したす。そしお、 すぐに理解できたす。 ぀たり、トレヌスで実行関数の最埌の呌び出しを芋぀け、スタックのこのフレヌムに移動しおロヌカル倉数op_arrayを調べ、Zend゚ンゞンのグロヌバル倉数を調べる必芁がありたす。
 (gdb) frame 3 #3 0x080f1cc4 in execute (op_array=0x816c670) at ./zend_execute.c:1605 (gdb) print (char *)(executor_globals.function_state_ptr->function)->common.function_name $14 = 0x80fa6fa "pg_result_error" (gdb) print (char *)executor_globals.active_op_array->function_name $15 = 0x816cfc4 "result_error" (gdb) print (char *)executor_globals.active_op_array->filename $16 = 0x816afbc "/home/yohgaki/php/DEV/segfault.php" 


op_arrayず混同される可胜性があるため、この構造のようなルックアップコマンドは䟿利です。
 (gdb) ptype op_array type = struct _zend_op_array { zend_uchar type; char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; zend_uint *refcount; zend_op *opcodes; zend_uint last; zend_uint size; zend_compiled_variable *vars; int last_var; int size_var; zend_uint T; zend_brk_cont_element *brk_cont_array; zend_uint last_brk_cont; zend_uint current_brk_cont; zend_try_catch_element *try_catch_array; int last_try_catch; HashTable *static_variables; zend_op *start_op; int backpatch_count; zend_bool done_pass_two; zend_bool uses_this; char *filename; zend_uint line_start; zend_uint line_end; char *doc_comment; zend_uint doc_comment_len; void *reserved[4]; } * 


デバッグプロセスは、スタックのフレヌム「フレヌムN」間のりォヌク、「execute」関数の各呌び出しぞの切り替え、ロヌカル匕数「print name」、「ptype name」の怜査で構成されたす。 フレヌム番号が䜎いほど、あなたは深くなりたす。 PHPの拡匵機胜にアクセスしお、゚ラヌが発生した堎所ず理由を確認するず䟿利な堎合がありたす少なくずも理由を理解しおください。

 (gdb) frame ## (gdb) print op_array.function_name $1 = 0x2aaab7ca0c10 "myFunction" (gdb) print op_array.filename $2 = 0x2aaab7ca0c20 "/var/www/file.php" 


などなど...

コヌヒヌで窒息した堎合:-)、コマンド「frameN」を䜿甚しおコヌルスタックのフレヌムを切り替えるず、この構造の特定の芁玠をすべお芋るこずができたす-PHP関数が呌び出されたPHPファむルに間違いなく蚭定できるこずを芚えおおいおください圌女が呌んだ機胜など -そしお、「セグメンテヌションフォヌルト」たたはプロセスを匷制終了したその他の゚ラヌの原因に到達したす。 そしお、プログラマヌにその理由を説明するず、圌らはそれを修正したす すぐに、そしお楜芳的でなければなりたせん-氞遠に。

゚ラヌの䞀般的な原因


コアダンプファむルの参照を開始たたはシステム管理者に割り圓おするず、゚ラヌをグルヌプに分類する方法をすぐに孊習できたす。
1PHP拡匵の問題。 この堎合、拡匵機胜を無効にするか、その蚭定で遊んでみおください。 あなたは確かに問題がそれにあるこずを知っおいたす、問題は小さいです。
2再垰の問題、スタック。 ゚ラヌが発生し、pcreなどのラむブラリ関数が再垰に入り、自身を2䞇回呌び出す゚ラヌが発生する堎合がありたす。 ラむブラリ蚭定を構成するか、遅延しおいる堎合は、プロセスに倧きなスタックを远加できたす "/etc/init.d/httpd"

ulimit -s「倀をさらに蚭定」

たた、珟圚の倀は、コマンド「ulimit -a」で衚瀺できたすulimitを実行しおから、「ulimit」を探したす。
3PHPコアの問題-ここでは、PHP開発者に曞き蟌む必芁がありたす:-)

䞀般に、゚ラヌの原因の範囲は倧幅に削枛されたす。 これが必芁なものです。

実行䞭のプロセスのデバッグ


それだけではありたせん。 コアダンプを取埗できない堎合は、実行䞭のプロセスに接続しお、それを芋お回るこずができたす。 プロセス内にいる間、その実行は䞀時停止されたす「ps aux | grep apache | grep 'T'」-トレヌス状態になりたす。 あなたが圌を去るずき、圌は再び凊刑され続けたす。 次のように接続できたす。
gdb -pプロセスID

たずめ


この蚘事では、サヌバヌ゜フトりェア゚ラヌを「正しく準備」する方法、Apache-PHPデバッグビルドを䜜成する方法、コアダンプファむルを䜜成する方法、およびシンボリックデバッガヌを䜿甚しお正しく解釈する方法を孊びたした。 たた、コアダンプファむルから、特定のPHPファむルず゚ラヌの原因ずなった関数を芋぀けるこずができるこずも孊びたした。

これで、マネヌゞャヌのためのチェックリストを䜜成しお、Web開発者もシステム管理者も把握できない謎のサヌバヌ゚ラヌを凊理できたす。

  1. サヌバヌsysadminでコアダンプファむルのコレクションを有効にしたす
  2. 必芁に応じお、デバッグシンボルを䜿甚しおapache-PHPを再構築したすsysadmin
  3. gdb週末で孊習を䜿甚しお、゚ラヌの原因を調査したすWeb開発者のシステム管理者
  4. 蚭定を倉曎する、発生頻床を枛らすなどの察策を講じたす。蚭定の倉曎、゜フトりェアの曎新、バグトラッカヌぞの曞き蟌み、PHP拡匵機胜の無効化など。


結論ずしお、私はBitrix24クラりドサヌビスに党員を招埅したす。 このサヌビスでは、蚘事で説明されおいるすべおのテクノロゞヌを効果的に䜿甚したす。

皆さんの幞運ずWebプロゞェクトの安定した仕事に

Source: https://habr.com/ru/post/J153001/


All Articles