【问题标题】:Stress Testing for Mysql via php通过 php 对 Mysql 进行压力测试
【发布时间】:2013-05-02 21:29:14
【问题描述】:

我想用 PHP 检查 Mysql 连接限制。我在循环中也插入了 mysql_connect mysql_pconnect 但它不会增加 Mysql 上的连接数....我也知道 php 不支持多线程

那么我该怎么做呢,我正在优化 mysql.ini 文件以实现最大连接,并希望通过压力测试来确保

【问题讨论】:

  • 你在使用 msyqli 吗?如果是这样,你为什么使用mysql_connect
  • 使用现有的基准测试工具可能会更好。从这里开始:dev.mysql.com/doc/refman/5.0/en/mysql-benchmarks.html(这是针对 mysql 5.0,确保选择正确的版本)。
  • @tadman 请告诉我在mysqli_connect的情况下是否有任何解决方案......我使用mysql_connect而不是mysqli_connect,因为它支持$new_link......但是它($new_link) 在关闭之前我没有在我的 php 脚本中的任何地方使用任何关闭连接命令后也会生成新连接
  • mysqli 是一个完全独立于 mysql 的库,它们不共享任何内容。您也不能混合和匹配功能。由于您根本不应该在新应用程序中使用mysql_query 和相关函数,因此您应该调查persistent connections 中的mysqli

标签: php mysql mysqli stress-testing


【解决方案1】:

这是一个简单的 PHP 压力测试工具,它创建一个测试表,将 1000 个条目加载到其中,选择它们然后逐个删除它们。与 ab(apache 基准测试)一起运行,您可以模拟数据库上的密集负载并比较几台服务器的性能。将其保存为stress.php,更新连接信息,然后从浏览器运行它:

<pre>
<?php
$sStart = microtime(true);

function random_str(){

$result="";
for ($i = 1; $i <= 16; $i++) {
$base10Rand = mt_rand(0, 15);
$newRand = base_convert($base10Rand, 10, 36);
$result.=$newRand;
}
return $result;

}

if ($_REQUEST['db']=='mon2') {
    mysql_connect ("server_test1", "db_user", "db_pass" || die (print 'no db');
} elseif ($_REQUEST['db']=='scooter') {
    mysql_connect ("192.168.33.3331", "umbrella", "umbrella") || die (print 'no db');
} elseif ($_REQUEST['db']=='camilla') {
    mysql_connect ("192.168.33.3332", "umbrella", "umbrella") || die (print 'no db');
} else {
    die (print 'no server');    
}
echo number_format(microtime(true) - $sStart, 2) ."s connect done\n";flush();
mysql_select_db ("test") || die (print 'no select_db');
$tbl_number=rand(1000, 9999);

$query = "CREATE TABLE IF NOT EXISTS test_tbl_$tbl_number (test1 int(100) NOT NULL, test2 int(100) NOT NULL, test3 int(100) NOT NULL, test4 int(100) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;";
mysql_query($query) || die (print 'no query');
echo number_format(microtime(true) - $sStart, 2) ."s CREATE done\n";flush();
$aa=array();
for ($i=1; $i <= 1000; $i++) {
$a=random_str();
$aa[]=$a;
$b=random_str();
$c=random_str();
$d=random_str();
$query="INSERT INTO test_tbl_$tbl_number SET test1='$a', test2='$b', test3='$c', 
test4='$d'";
mysql_query($query) || die (print 'no insert');
}
echo number_format(microtime(true) - $sStart, 2) ."s INSERT (1.000) 
done\n";flush();

$query="SELECT SQL_NO_CACHE * FROM test_tbl_$tbl_number";
mysql_query($query) || die (print 'no select_db');
echo number_format(microtime(true) - $sStart, 2) ."s SELECT (1) done\n";flush();

foreach ($aa as $value) {
$query="DELETE FROM test_tbl_$tbl_number WHERE test1='$value'";
mysql_query($query) || die (print 'no delete');
}
echo number_format(microtime(true) - $sStart, 2) ."s DELETE (1.000) 
done\n";flush();

$query="DROP TABLE test_tbl_$tbl_number";
mysql_query($query) || die (print 'no drop');
echo number_format(microtime(true) - $sStart, 2) ."s DROP (1.000) done\n";flush();

?>

【讨论】:

  • 不知道为什么早先的否决票,但这正是我正在寻找测试我的 PHP + MYSQL 负载(使用 ab)。也许投反对票是因为它不能复制/粘贴......
【解决方案2】:

仅仅通过创建n 与 MySQL 的连接并不意味着您将获得任何有意义的结果。如果您在 MySQL 中有 1000 个连接作为 max_connections 变量,并且您确实建立了 1000 个连接,则第 1001 个连接将被拒绝。

此外,可以有 999 个连接不消耗 MySQL 资源,并且 1 个可以运行超级昂贵的查询。

关于 PHP 和多线程 - 遗憾的是,您知道错了。 PHP does support user-land multithreading

【讨论】:

  • 关注dev.mysql.com/doc/refman/5.7/en/too-many-connections.html 我想建立连接并在数据库上执行一些查询,我也更改了限制,但我该如何测试
  • 只需将连接限制降低到 2,通过 GUI 连接到 MySQL,然后通过 PHP 并测试您需要的内容。实际上没有必要超过 151 个连接。
  • 参考我的链接 Windows 仅限于(打开的表 × 2 + 打开的连接)
【解决方案3】:

mysql_connect 的第四个参数是$new_link。

默认情况下,如果在同一个请求中给出相同的参数,mysql_connect 不会创建新链接,这就是发生在你身上的事情。通过将 $new_link 设置为 true 来覆盖此行为。

http://php.net/manual/en/function.mysql-connect.php

不要使用mysql_函数:The Mysql extension is deprecated and will be removed in the future. Use Mysqli or PDO.

编辑:添加 mysql_ 警告

【讨论】:

  • 我知道它已被弃用,我在 mysql_connect 中使用了 $new_link,我使用了 mysql_connect 而不是 mysqli_connect,因为它在 mysqli 中支持 $new_link .....但是它($new_link)在之后也会生成新的连接关闭上一个我没有使用任何关闭连接命令
  • 如果您知道它已被弃用,那么您就知道您正在创建的代码会在从 PHP 中删除该函数时自毁。
  • @Engr.UmairAzizAttari “关闭前一个连接后生成新连接”你确定吗?文档中对此一无所知,AFAIK 这不是真的。如果旧的连接句柄失效,就会产生各种问题,并使 $new_link 选项的用处失效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2012-02-28
  • 2023-04-10
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多