不一样的思想~~ http://shop34712791.taobao.com MSN:wins0910@hotmail.com

mysql sleep 线程过多 (摘抄)

上一篇 / 下一篇  2008-03-11 23:28:25 / 个人分类:待分析

关于Apache::DBI与MYsql的持续连接太多的问题


(这条文章已经被阅读了324次) 时间:2002年03月08日 19:10 来源:韩伟 收藏

关于Apache::DBI与MYsql的持续连接太多的问题大家已经研
究了一段时间了。

我经过这几天研究发现mod_perl提供的持续连接并不智能(也许是我还没有找到更
好的解决方案),如果脚本中的参数和初始化的参数不一样,在内存中会出现两个
句柄。

Apache::DBI->connect_on_init("DBI:mysql:mysql:localhost","root","root",
{
PrintError => 1,
RaiseError => 0,
AutoCommit => 1,
});



my $dbh = DBI->connect("DBI:mysql:database=localhost","root","root",{
PrintError => 1,
RaiseError => 0,
AutoCommit => 1,
});

以上两个语句实现同一个连接,返回同一种结果,但是他们的概念完全不一样。

经过统一参数,写作方法,和格式。测试后,发现process不再无故增长,达到预
期效果。

事故原因分析:对于一个数据库,Apache::DBI建立一个持续连接, 如果在
startup.pl文件中初始化的时候采用一种书写格式,参数,而脚本中
DBI->connect又采用不同的连接方式和格式,因此假如一个以上的句柄实现同一个
目的(连接同一个数据库)的话,最后一个连接进入时,它会企图查找最后一个相
匹配的句柄(Handler),换句话说就是找一个参数,格式都一样的句柄。这里问题
就出来了,内存中存在两个实现同一目的的句柄(但是格式或参数不一样),这个
连接无法识别应该使用哪一个,所以被迫建立一个新的句柄,而导致原先的句柄继
续Sleep(我管它叫做僵尸句柄)。

解决方案:其实解决方法非常简单,因为昨天我也在其他操作系统上(RedHat 7)装
了Apache+Mod_perl+Mysql,仍然出现相同的问题。根据内存分析与同伴们的测
试。得出一个结论,当内存中连接同一数据库的句柄数在一个以上的时候,
process会无故增加,当句柄为一个的时候,process不会增长,而采用原有内存中
的句柄,这个就是我们想要的。为实现这一目的,我们需要统一初始化和connect
的格式,参数和相关信息。

关于并发处理:测试发现,句柄初始化在process中建立的5个连接完全可以人工控
制。修改MinSpareServers(最小空闲服务器)和MaxSpareServers(最大空闲服务器)
的数量。该数量放的越大,服务器的并发处理能力就越高。但是我们要付出的是宝
贵的内存为代价,根据网站的点击次数合理调节该数量是最为明智的选择。如果服
务器遇到大量并发请求,系统会自动克隆相应的句柄以适应并发的数量。当请求完
毕后,系统将自动断开克隆的句柄以释放沉余的内存。大家看下面的例子,我采用
ab(ApacheBench)这个工具对服务器请求5000次,并发数为100,观看mysql的句柄
线程数,最高峰值达到50,当请求完毕后,释放沉余的句柄空闲内存,这时线程数
量又恢复到5个(我的Apache Config File中 MaxSpareServers 设置为5)。

D:\>ab -n 5000 -c 100 http://10.4.1.32/mod_perl/dbi.cgi
This is ApacheBench, Version 1.3e <> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.
net/
Copyright (c) 1998-2001 The Apache Software Foundation,
http://www.apache.org/

Benchmarking 10.4.1.32 (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Finished 5000 requests
Server Software: Apache/1.3.20
Server Hostname: 10.4.1.32
Server Port: 80

Document Path: /mod_perl/dbi.cgi
Document Length: 99 bytes

Concurrency Level: 100
Time taken for tests: qd.qd seconds
Complete requests: 5000
Failed requests: 0
Write errors: 0
Total transferred: 1220000 bytes
HTML transferred: 495000 bytes
Requests per second: 132.37 [#/sec] (mean)
Time per request: 755.48 [ms] (mean)
Time per request: 7.55 [ms] (mean, across all concurent requests)
Transfer rate: 32.30 [Kbytes/sec] received

Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 72.2 0 2964
Processing: 80 743 3199.6 260 37263
Waiting: 10 725 3198.1 240 37253
Total: 80 746 3200.0 260 37263

Percentage of the requests served within a certain time (ms)
50% 260
66% 320
75% 420
80% 490
90% 741
95% 3054
98% 4606
99% 4626
100% 37263 (last request)

--------------------------

多种原因

mysql_pconnect()/mysql_close()和mysql_connect()

PHP.ini
my.conf: wait_timeout/interactive_timeout

slow_query.log

 


 


相关阅读:

TAG: 待分析

 

评分:0

我来说两句

Open Toolbar