Bug 226702

Summary: httpd+php+mysql leaves half-open connections to mysql after intense use
Product: Red Hat Enterprise Linux 5 Reporter: George Toft <george>
Component: httpdAssignee: Joe Orton <jorton>
Status: CLOSED NOTABUG QA Contact: David Lawrence <dkl>
Severity: medium Docs Contact:
Priority: medium    
Version: 5.0   
Target Milestone: ---   
Target Release: ---   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2007-02-05 15:24:47 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description George Toft 2007-02-01 00:42:54 UTC
Description of problem:
httpd + php leave open connections to database server after stress test or heavy
use.


Version-Release number of selected component (if applicable):
httpd-2.2.3-5.el5
php-5.1.6-3
php-mysql-5.1.6-3
php-pdo-5.1.6-3

How reproducible:
Use test tool, such as Jakarta jmeter, to put 50 threads against a simple test
page that pulls back a table from a mysql database.


Steps to Reproduce:
Create simple mysql database on one server.  database has 1 table with 1.6M
bytes of information in 25,000 rows.
Set up apache+php on another server.
Set up jmeter on a web client
Run jmeter against apache.
Watch ESTABLISHED connections to database server from web server
Watch ESTABLISHED connections from web server to database server 

  
Actual results:
After test stops, several connections are open on web server:
[root@rhel5xen1 logs]# netstat -an | grep EST | grep 3306
tcp        0      0 ***.***.76.120:48398          ***.***.75.6:3306            
ESTABLISHED
tcp        0      0 ***.***.76.120:48549          ***.***.75.6:3306            
ESTABLISHED
tcp        0      0 ***.***.120:41543          ***.***.75.6:3306            
ESTABLISHED
tcp        0      0 ***.***.76.120:41052          ***.***.75.6:3306            
ESTABLISHED
[root@rhel5xen1 logs]#

The above was 2 hours after the test finished.  Immediately after the test,
there were 8 of these half-connections.


There are no ESTABLISHED connections on the db server:
[root@RH3-6850 root]# netstat -an | grep EST | grep 3306
[root@RH3-6850 root]#




Expected results:
Expect no ESTABLISHED connections from either end after the test ends.


Additional info:
Sanitized PHP page source:
<html>

<body>

<?php

$db = mysql_connect("***.***.***.***", "dbuser");

if (!$db)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("testdb",$db);

$result = mysql_query("SELECT Name, Account, CID FROM nameaccount",$db);

echo "<table border=1>";

echo "<tr><td>Name</td><td>Account</td><td>CID</td></tr>\n";

while ($myrow = mysql_fetch_assoc($result)) {

        echo
"<tr><td>{$myrow['Name']}</td><td>{$myrow['Account']}</td><td>{$myrow['CID']}</tr>";

}

echo "</table>\n";

mysql_close($db);

?>

</body>

</html>


database summary:
mysql> select count(*) from nameaccount;
+----------+
| count(*) |
+----------+
|    24999 |
+----------+
1 row in set (0.03 sec)

mysql> describe nameaccount;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| Name    | varchar(255) | YES  |     | NULL    |       |
| Account | varchar(255) | YES  |     | NULL    |       |
| CID     | varchar(255) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql>

Comment 1 Joe Orton 2007-02-05 15:24:47 UTC
It is expected behaviour that php-mysql leaves database connections open in the
default configuration: see:

  http://www.php.net/manual/en/features.persistent-connections.php

edit the persistence settings in /etc/php.ini to change this.