最近 在OSX 开发Wordpress,nginx偶尔会出现502错误,查看日志发现:
2016/07/15 12:44:28 [error] 239#0: *5670 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: dev.cellmean.com, request: “GET /%e6%b5%8b%e8%af%95%e6%a0%87%e9%a2%98/ HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “dev.cellmean.com”, referrer: “http://dev.cellmean.com/%e6%b5%8b%e8%af%95%e6%96%87%e7%ab%a0%e5%90%8c%e6%ad%a5%e5%88%b0-osc/”
…
似乎跟上游的php-fpm有关,查看php-fpm.log:
[15-Jul-2016 12:44:28] WARNING: [pool www] child 79191 exited on signal 11 (SIGSEGV) after 18.827492 seconds from start
[15-Jul-2016 12:44:28] NOTICE: [pool www] child 79349 started…
可以看到出现的时间跟nginx的时间是一致的,php进程池遇到(SIGSEGV)错误, 重启了。关闭了对nginx请求的处理。
在日志的其他地方还能看到另一个信号(SIGBUS) :
[15-Jul-2016 20:41:58] NOTICE: [pool www] child 86825 started
[15-Jul-2016 20:44:59] WARNING: [pool www] child 79193 exited on signal 10 (SIGBUS) after 14402.816372 seconds from start…
关于这两个信号的说明:http://blog.csdn.net/haogaoming123/article/details/42082483
涉及共享内存的管理就不能不提到访问共享内存对象。谈到访问共享内存对象就要留神“SIGSEGV和SIGBUS”这两个信号。
系统分配内存页来承载内存映射区,由于内存页大小是固定的,所以存在多余的页空间空闲,比如待映射文件大小为5000 bytes,内存映射区大小也为5000 bytes。而一个内存页大小4096,系统势必要分配两页来承载,这时空闲的有效空间为从5000-8191,如果进程访问这段地址空间也不会发生错误。但是要超出8191,就会收到SIGSEGV信号,导致程序停止。关于SIGBUS信号的来历,这里也举例说明:若待映射文件大小为5000 bytes,我们在mmap时指定内存映射区size = 15000 > 5000,页承载大小16384,而内核真正的共享区承载体大小只有8192(能包容映射文件大小即可),此时在[0,8191]内访问均没问题,但在[8192, 16383]之间会得到SIGBUS信号;超出16384访问时会触发SIGSEGV信号。
to be continue…