5 php mysql apache networking tcp
我们看到一些奇怪的行为,我们不确定它是否是apache,php,mysql或操作系统的问题,所以对于stackoverflow的大脑!
我们有Apache和mod_php与mysql5服务器通信.有时,进程会选择挂起,尝试从文件描述符中读取.
在它们上面填一个strace(所有悬挂过程显示相同的结果)给出了:
[root@prweb133v ~]# strace -p 8450
Process 8450 attached - interrupt to quit
read(57, <unfinished ...>
Run Code Online (Sandbox Code Playgroud)
那它试图读什么呢?
[root@prweb133v ~]# lsof -p 8450
...
...
httpd 8450 apache 57u IPv4 5546599 TCP
prweb133v.local:36615->hadat.local:mysql (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
那是我们的mysql服务器!好的,所以也许它试图读取查询的结果,我想.检查mysql服务器上的进程列表,建立了连接但处于SLEEP状态.
Hmmmm.
那么我检查了netstat以查看谁正在尝试发送/接收内容.
在网络服务器上:
[root@prweb133v ~]# netstat -t -n -a | grep 36615
tcp 0 5 172.23.179.6:36615 172.23.179.67:3306
ESTABLISHED
Run Code Online (Sandbox Code Playgroud)
并且在mysql服务器上有一个已建立的连接,但在发送或接收队列中为0.
知道这些神秘的5个字节是什么,或者为什么他们随机不得到mysql服务器?
干杯!
麦克风
你使用什么mysql引擎(myisam,innodb,...)?你在php端使用mysql还是mysqli接口?
我会尝试mysql配置文件中的“log”和“log_slow_queries”(可能是ramdisk),同时涉水“SHOW GLOBAL STATUS;”的输出 在 mysql shell 中(每个以“*_waits”结尾或与连接相关的服务器变量)。
您是否更改了 mysql 配置文件的“微调”部分中的任何部分?改变了一些缓冲区?
在 php.ini 中,mysql.connect_timeout 是否有默认值(60)?将“mysql.trace_mode”设置为“on”暂时不会有什么影响。
如果可能的话,您可能还想使用“ab”等工具对应用程序的不同部分/URL 进行压力测试,以缩小范围。
或者:当使用带有 prefork 模块的 apache 时,仅在本地启动一台服务器(“Startservers 1”、“MaxSpareServers 0”等)并进行压力测试,直到它挂起。那么日志可能会具有更大的价值。
| 归档时间: |
|
| 查看次数: |
2761 次 |
| 最近记录: |