1

I have nginx 1.6, mysql 5.5, php 5.6.11 server configuration. Occasionally, PHP segfaults, always when it's been idle for a few minutes (no requests have been made). If there are requests, this segfault doesn't happen.

I have run core dump through gdb utility with this result:

root@server3:/# gdb /usr/local/php-5.6.11-fpm/sbin/php-fpm /tmp/coredump-php-fpm.5867 .... Reading symbols from /usr/local/php-5.6.11-fpm/sbin/php-fpm...done. [New LWP 5867] warning: Can't read pathname for load map: Input/output error. [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff1effe000 Core was generated by `php-fpm: p'. Program terminated with signal 11, Segmentation fault. #0 0x00000000035417f0 in ?? () (gdb) bt #0 0x00000000035417f0 in ?? () #1 0x00000000009a9548 in php_mysqlnd_net_send_ex_pub (net=0x350e010, buffer=0x7fff1ef47e10 "\001", count=1, conn_stats=0x353ee30, error_info=0x35323b8) at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd_net.c:442 #2 0x0000000000996420 in php_mysqlnd_cmd_write (_packet=0x34ca830, conn=0x3532280) at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd_wireprotocol.c:999 #3 0x00000000009702f5 in php_mysqlnd_conn_data_simple_command_send_request_pub (conn=0x3532280, command=COM_PING, arg=0x0, arg_len=0, silent=1 '\001', ignore_upsert_status=1 '\001') at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:356 #4 0x00000000009706c6 in php_mysqlnd_conn_data_simple_command_pub (conn=0x3532280, command=COM_PING, arg=0x0, arg_len=0, ok_packet=PROT_OK_PACKET, silent=1 '\001', ignore_upsert_status=1 '\001') at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:381 #5 0x000000000097bb98 in php_mysqlnd_conn_data_ping_pub (conn=0x3532280) at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:1728 #6 0x000000000077c378 in pdo_mysql_check_liveness (dbh=0x3532830) at /usr/src/php-5.6.11/ext/pdo_mysql/mysql_driver.c:493 #7 0x000000000076aa10 in zim_PDO_dbh_constructor (ht=4, return_value=0x34ccdd8, return_value_ptr=0x7f3796811b80, this_ptr=0x34f8708, return_value_used=0) at /usr/src/php-5.6.11/ext/pdo/pdo_dbh.c:307 #8 0x0000000000acb14b in zend_do_fcall_common_helper_SPEC (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:558 #9 0x0000000000acb91b in ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:693 #10 0x0000000000aca7b8 in execute_ex (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:363 #11 0x0000000000aca840 in zend_execute (op_array=0x7f3796841d80) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:388 #12 0x0000000000a862e6 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /usr/src/php-5.6.11/Zend/zend.c:1341 #13 0x00000000009ead57 in php_execute_script (primary_file=0x7fff1ef4a8d0) at /usr/src/php-5.6.11/main/main.c:2597 #14 0x0000000000b471c9 in main (argc=1, argv=0x7fff1ef4cc38) at /usr/src/php-5.6.11/sapi/fpm/fpm/fpm_main.c:1964 

All I see that there is some problem when calling mysqlnd function through PDO. But really nothing more. The code is running fine on older PHP versions ( < 5.6 ) s I don't assume it's problem of my code, rather some problem with PHP ?

PHP is compiled like this:

./configure --prefix=/usr/local/php-5.6.11-fpm --enable-ftp --with-gd --enable-mbstring --enable-sockets --enable-zip --with-jpeg-dir=/usr/local/jpeg-9 --with-zlib --enable-embedded-mysqli --with-pdo-mysql --with-png-dir=/usr/local/libpng --with-openssl=/usr/local/openssl --with-freetype-dir=/usr/local/freetype --with-mcrypt=/usr/local/libmcrypt --with-mhash --enable-soap --enable-bcmath --with-mysqli=mysqlnd --with-mysql --enable-fpm --enable-debug 

I will appreciate any hint or help, thanks.

1 Answer 1

4

OK, finally (after few hours of detective work) I have found answer to my own question. I will post it, as it may help someone with the same problem.

Actually there were 2 problems in my case. The main problem causing this behaviour was MySQL disconnecting after 60 idle seconds of persistent connection. I have this setting on production server as there is many requests each second so 60 seconds is reasonable setting (in contrast of 8 hours set in my.cnf as default - wait_timeout = 28800).

However I have copied this to a development server, where a request is made once in a while. So the 60 seconds limit was hit. And my then compiled PHP resulted in SEGFAULT.

During my search I also found this PHP manual page dealing with possible MySQL libraries in PHP. So I have used recommended compile directives:

--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd 

And then the dropped Mysql connection stopped the SEGFAULT problem, it only resulted in correct Exception thrown by PDO.

Hope it helps someone in future.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.