最近发现
在我尝试过的其他所有操作中,我用自定义JavaScript替换了我的JMeter配置文件,该JavaScript在无限循环中依次命中我的每个API端点,然后在不同的浏览器(一个Firefox,一个Chrome,一个Safari)中并行运行此脚本 - 以尝试排除与我来自同一来源的所有连接相关的问题(相同的用户代理, 相同的 Cookie、相同的会话 ID 等)
当我这样做时,我注意到我的所有问题都消失了。查询并行运行,该应用程序的响应速度比JMeter让您相信的要快得多。
在我看来,JMeter不可能序列化请求,因为它是负载测试的事实标准。所以我开始尝试重现这种行为。
为了重新创建JMeter,我创建了以下两个PHP脚本,它们(希望)模拟了我的Yii应用程序:
慢.php
<?php
session_start();
$_SESSION['some'] = 'value';
// Yii is calling session_write_close() almost immediately after
// the session is initialized, but to try and exacerbate issues,
// I've commented it out:
// session_write_close();
$dsn = "mysql:host=localhost;dbname=platypus;unix_socket=/tmp/mysql.sock";
$pdo = new PDO($dsn, "user", "password");
// Yii was using whatever the default persistence behavior was,
// but to try and exacerbate issues I set this flag:
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
// Simulate a query running for 1 second by issuing a 1-second sleep
$pdo->query("DO SLEEP(1)");
echo "Done";
快速.php
<?php
session_start();
$_SESSION['some'] = 'value';
$dsn = "mysql:host=localhost;dbname=platypus;unix_socket=/tmp/mysql.sock";
$pdo = new PDO($dsn, "user", "password");
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
// Simulate a query running for 0.1 seconds
$pdo->query("DO SLEEP(0.1)");
echo "Done";
针对这两个新端点运行 JMeter 时,没有序列化请求。一切都是并行运行的。fast.php总是在100-150ms内返回并且速度很慢.php总是在1000-1050ms内返回,即使我扩展到3,4和5个线程也是如此。我能够看到东西在11个线程处崩溃,但那是因为我超过了PHP中的工作线程数。
所以总结一下:
仅当使用 JMeter 分析我的 API 时,才会出现此问题,而这并不是应用本身所固有的
这个问题不仅仅是一个JMeter错误,而是以某种方式与我的应用程序或Yii 1.1有关。
我尝试过,但无法提出最小的重现案例
尽管在使用其他工具进行分析时不存在该问题,但很多人都做出了回应并提供了许多有用的信息:
避免PHP中的持久连接(可能导致多个请求共享一个连接,可能不是)
通过尽早呼叫来避免会话锁定session_write_close()
确保有足够的 PHP 工作线程来处理同时连接数
MySQL完全支持并行请求(如果硬件可以处理它)
警惕表锁定(任何具有语句的事务都可能锁定表)UPDATE
MyISAM 执行表级锁定而不是行级锁定
ibeautiful
牧羊人nacy
慕的地8271018
翻阅古今