之前思考过两种统计模式的各种误差来源,以及如何避免这些可能产生的误差。又做了一些具体的框架改进,如下列文章所示:
今天分享一下在性能测试统计中,各种参数和性能指数对性能测试误差的影响,以及各种减少误差方法效果,以便知道以后的性能测试改如何改进。
演示 Demo
我写了一个模拟正常单接口性能测试的时候的Demo
,我使用了ThreadLimitTimesCount<String>
模型,使用sleep()
方法模拟请求和响应,具体代码如下:
/**
* 性能测试统计误差测试类
* by:FunTester
*/
class DeviationTest extends SourceCode {
static void main(String[] args) {
def ts = []
10.times {
ts << new FunTester(StringUtil.getString(10), 60)
}
new Concurrent(ts, "FunTester误差分析").start()
}
private static class FunTester extends ThreadLimitTimesCount<String> {
FunTester(String s, int times) {
super(s, times, null)
}
@Override
protected void doing() throws Exception {
sleep(0.1)
}
@Override
ThreadBase clone() {
new FunTester(StringUtil.getString(10), times)
}
}
}
下面开始针对之前提到的误差来源进行对比分析了。
由于模拟的时间比较短,这里就不进行标准的演示了。在我自己测试空转的过程中也很难在ms
级别统计代码运行,所以我也放弃了对代码运行时间的对比。
线程数
首先来研究一下,线程数对性能测试误差的影响。首先我们先来一组配置20
线程、50
请求次数在固定请求时间的情况下的模拟,看一下结果。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"3.29%",
> ① . "errorRate":0.0,
> ① . "executeTotal":1000,
> ① . "qps2":187.79342723004694,
> ① . "total":1000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 15:40:58",
> ① . "endTime":"2021-04-05 15:41:04",
> ① . "mark":"FunTester误差分析051540",
> ① . "table":"eJztjzEKwkAQRfvA3mEOkEC0sMgBPIDkAgEHXHBXySYQSxElpVVKj2BK7xOIeAxX7SzcFUQZmeHDm2r+PBGAx4xLnaIpML+0bX869vXufNjDMIZilmM29TkBIhCvuyZolgttEFKpMIEqMpjLbA66VCGsIoVTmWlXh/sPJTU8biWDOAZlQpVVdh3Z9QMWjumajY0DWxs/1Db2p65Z28AzPKreLr43fhs3w58UsyEbsiEb/hHYkD7YkD7YkD7YkD7YkD7YkD7YkD7YkD7YkD7YkD7YkD7YkD5EcAVmaHb1"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
实测平均耗时103ms
,总的误差是3.29%
,不算很高。下面看一下配置40
线程、50
请求次数在固定请求时间的情况下的模拟,看一下结果。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":40,
> ① . "deviation":"2.7%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":377.8575477045154,
> ① . "total":2000,
> ① . "qps":388.3495145631068,
> ① . "startTime":"2021-04-05 15:43:19",
> ① . "endTime":"2021-04-05 15:43:24",
> ① . "mark":"FunTester误差分析051543",
> ① . "table":"eJztz08KgkAUBvC94B3eARQUooUH6ADhBQQHEpopHANbRv9ctnLZEXLZfQSjYzTVrmiUCsbFNzz43Pje97Mt6vBGCxEymbH0WlXN+dQUu8vxQAOPsknKorjLCrItW39rzOR8JiSjMOEsoNyVLE2iKYkFd2jpchYnkWi70d6DJ4KeuwLf84hLh0d54PtD9fkHxa+vLgs1nSS9vFKXKzWfQnf1wy9rNW+xVdMt9mq+iUdTXdhWXW7U0Gvo2rRu7VPchT2oASGEEJqvASGEEJqvASGEEJqvASGEEJqvASGEEJqvASGEEJqvASGEWuENvcRZ6Q=="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
实测平均耗时103ms
,总的误差是2.7%
,可以说很相近,再试一组100
线程的,其他条件不变。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":102,
> ① . "failRate":0.0,
> ① . "threads":100,
> ① . "deviation":"3.7%",
> ① . "errorRate":0.0,
> ① . "executeTotal":5000,
> ① . "qps2":944.1087613293051,
> ① . "total":5000,
> ① . "qps":980.3921568627451,
> ① . "startTime":"2021-04-05 15:44:33",
> ① . "endTime":"2021-04-05 15:44:38",
> ① . "mark":"FunTester误差分析051544",
> ① . "table":"eJztzz0KwjAUwPE9kDu8A7RQF4cewANILxAwYMBEaVqoo4jS0amjR7Cj9ylUPIYpblXaih/w5IUHv0x5+XMGA84kNZG0iYyvZVmfT3W+vxwPMAoCSOaxFLMhb3DGu3dNpV0tjZUQKS1DyHwrYyUWYFLtwdrXcqaE6dvR/w+tDNzfCpsAbT0tMncdu+sHKrpOVWzdPLBz8xK5mxacVcXGDbR5urGLt77xRZrC326kQiqkQir8P6gQP1SIHyrEDxXihwrxQ4X4oUL8UCF+qBA/VIgfKsQPFeKHsxsIDnrM"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
这次虽然平均响应时间更准了,但误差反而更高了,我们再试一组200
线程的。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":200,
> ① . "deviation":"3.2%",
> ① . "errorRate":0.0,
> ① . "executeTotal":10000,
> ① . "qps2":1879.6992481203008,
> ① . "total":10000,
> ① . "qps":1941.7475728155339,
> ① . "startTime":"2021-04-05 15:45:27",
> ① . "endTime":"2021-04-05 15:45:33",
> ① . "mark":"FunTester误差分析051545",
> ① . "table":"eJztjz0KwkAQRvvA3mEOkEC0MwfwAJILBFww4K6STUBLxZ+UVik9gpbeR4h4DEctRDBmQVFGZ/ngTbPzzRMOWLx2pkNpUpkct9tytynzxWG9gqbvQ9pLZNS12SEc8byrI81woI2EMFYygJFnZBJHfdCZcmHsKdmNI13XUX+HijVcdwUNFFDGVdEIxxaOb7B49e2LHGNlcvsywdRghqnCHGOHy233EM6+mGKgAvbLl5gqPCj+GM6G3+xnQzZkQzb8BbAhfbAhfbAhfbAhfbAhfbAhfbAhfbAhfbAhfbAhfbAhffyD4QlUrRlG"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
目前来看,线程数对于误差影响不大,几乎可以忽略。
时间&次数
再来看看测试时间和请求次数的影响,因为这次我选择的固定请求次数的模型,所以主要研究参数还是请求次数。
首先来一组,20
线程、20
请求次数在固定请求耗时的模拟结果。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":105,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"5.28%",
> ① . "errorRate":0.0,
> ① . "executeTotal":400,
> ① . "qps2":180.42399639152006,
> ① . "total":400,
> ① . "qps":190.47619047619048,
> ① . "startTime":"2021-04-05 15:48:19",
> ① . "endTime":"2021-04-05 15:48:21",
> ① . "mark":"FunTester误差分析051548",
> ① . "table":"eJztkksKwjAYhPdC7/AfwEIrrnoADyC9QKEBAyZKU0GX4nPpqkuPoEvvU6h4DOMDQbDaWjFdzM/AZDUzH8RqUIHrjKTPVMyi036fHXbZenncbqjlUNyLWBAWiSCrYb3v6jI1HEjFyOeCeTS2FYt40Cc5Ek2a2IKFPJCfOj7vEFzSLctzHYeEaopg7Lntln7+gKLqpclaqxDJ9xULrf80XSvQhKavmtJkqpVnM608u//w0rbSyrPn5Wky16KHlY57kVonuxDWYAYIQQhC8zNACEIQmp8BQhCC0PwMEIIQhOZngBCEIDQ/A4SVCM8WpxSi"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
平均响应时间105ms
,误差5.28%
。现在将请求次数增加到50
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":104,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"2.79%",
> ① . "errorRate":0.0,
> ① . "executeTotal":1000,
> ① . "qps2":186.9508319312021,
> ① . "total":1000,
> ① . "qps":192.30769230769232,
> ① . "startTime":"2021-04-05 15:49:42",
> ① . "endTime":"2021-04-05 15:49:48",
> ① . "mark":"FunTester误差分析051549",
> ① . "table":"eJztz0sKwjAUBdB5oXt4C1BoxVEX4ALEDQQaMGCiNBbqUPx16MihS9Ch+xEUl2HUgeAvhRZi4YYHN4M27x7fowKnk6oe12OeXPb702F3ypfn7ZpaAY37CWdxkSfI9/zfu7pcj4ZKc+oJySPKmpongg1IpbJBk6bksWDKtsPeQwpFj7eiMAhI6oZkWRS2Q3OtQFH2HDe5mUISbMGWum05bqZm3mJmxhJzM5ZYmKks7uU/hu+9frsy84zvf9YlbsI/qAEhhBC6rwEhhBC6rwEhhBC6rwEhhBC6rwEhhBC6rwFhKeEVVbcQ1Q=="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
平均响应时间和误差都有所下降,现在增加到100
请求,看看结果。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"1.51%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":191.2411550965768,
> ① . "total":2000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 15:50:56",
> ① . "endTime":"2021-04-05 15:51:06",
> ① . "mark":"FunTester误差分析051550",
> ① . "table":"eJztzzEKwjAUBuC9kDu8A7RQHRx6AA8gvUDAgAETpWmhjiJKR6eOHsGO3qdQ8RhG3EqxlQpx+MOD/015/8c8GvDmmY6FSUXyqKrmdm2K0/1ypmlI6SoRfDnkC2Ie+3xrIcx2o42gWCoRUR4YkUi+Jp0pn3aBEkvJdd+N/h5Kanr/FU3CkJTxFc/tOrPrDxTdry4PdnriaOerKOy0gnl1ubdD7Rh5v+OUo3gJ/6AGhBBC6L4GhBBC6L4GhBBC6L4GhBBC6L4GhBBC6L4GhBBC6L4GhBBC6L4GhKOET/9xgkk="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
平均响应时间和误差进一步降低了,看来增加请求次数是可以降低误差的,这也是符合直觉的。下面再进行一组200
请求次数的测试。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"0.69%",
> ① . "errorRate":0.0,
> ① . "executeTotal":4000,
> ① . "qps2":192.8268414963363,
> ① . "total":4000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 15:52:23",
> ① . "endTime":"2021-04-05 15:52:44",
> ① . "mark":"FunTester误差分析051552",
> ① . "table":"eJztzzEKwjAUBuC9kDu8A7RQHRx6AA8gvUDAgAETpWmhjiJKR6eOHsGO3qdQ8RhGRBBBW7EQhz88+N+U93/Mow5vnOlYmFQkl6pqTsem2J0PexqGlM4SwaddviDmsc+3JsIsF9oIiqUSEeWBEYnkc9KZ8mkVKDGVXLfdaO+hpKb7X9EgDEkZX/HcriO79qB4++pyY6cltna+isLOI5hXl2s79Br9HH4+5Shuwj+oASGEELqvASGEELqvASGEELqvASGEELqvASGEELqvASGEELqvASGEELqvAeFPwisab36D"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
相信结论已经很明显了。增加测试请求次数是可以有效降低误差的。
请求耗时
现在模拟一下请求耗时对误差的影响,直觉来讲,耗时越长,误差越小,因为系统误差一定的情况下,耗时越长,误差的所占的比例也就越小了。
先进行一组耗时50ms
的测试,线程数20
,请求次数设置100
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":52,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"3.99%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":369.2762186115214,
> ① . "total":2000,
> ① . "qps":384.61538461538464,
> ① . "startTime":"2021-04-05 15:56:36",
> ① . "endTime":"2021-04-05 15:56:42",
> ① . "mark":"FunTester误差分析051556",
> ① . "table":"eJztz08KgkAYBfC94B2+AyhIUAsP0AGiCwgOJDRTOAq27C8uW7nsCLnsPoLRMRpqV6QTSRP05MFzNd/72RZpfMNUjJlMWHwpy/p0rPPd+bCnnkfJJGZBqPME2ZbdfGvE5HwmJKNxxJlPmStZHAVTEil3aOFyFkaBaLuhMYRHgu6P+X2PuHR4kPn9gfrrQvHeVxVrFb3KVfSEDydWKq9qq9JSt7v69bSwKpYqetX9nA/Ltqpio0LN9d1RnQt/YAaEEEJofgaEEEJofgaEEEJofgaEEEJofgaEEEJofgaEEEJofgaEEP658ApAgBUd"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
下面增大响应耗时到100ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"1.25%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":191.75455417066155,
> ① . "total":2000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 15:58:00",
> ① . "endTime":"2021-04-05 15:58:10",
> ① . "mark":"FunTester误差分析051558",
> ① . "table":"eJztzzEKwjAUgOE9kDu8A7RQHRx6AA8gvUCgAQMmStNCHUWUjk4dPYIdvU+h4jGMiOBSW6EoT1548GXKy88Z9DjTzETSpjK5VlVzPjXF/nI8wDiAdJ5IEfd5Ajjj73fNpF0tjZUQKS1DyH0rEyUWYDLtwdrXMlbCdO3o/odWBh5vhaMgAG09LXJ3nbjrABWtpy63bjrYufmIws0Tzupy4wZaGGb/68Zvcy/85X4qpEIqpMJ/gArxQ4X4oUL8UCF+qBA/VIgfKsQPFeKHCvFDhfihQvxQIX44uwGetH51"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
误差下降了一半还说,再次说明了直觉是对的。现在继续增加响应耗时到200ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":203,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"0.95%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":97.58477677482313,
> ① . "total":2000,
> ① . "qps":98.52216748768473,
> ① . "startTime":"2021-04-05 15:59:25",
> ① . "endTime":"2021-04-05 15:59:46",
> ① . "mark":"FunTester误差分析051559",
> ① . "table":"eJztzzEKwjAUgOE9kDu8A7RQOjj0AB5AeoFAHxgwUZoW6iha6ejk6BHs6H2Eiscw4CbW1sHhyQsPvpAhyS8FjFjT0qboCszvbdtdzl2zv50OEEdQzHNU2ZgrQAr5+a0ZutXSOoRUG0ygCh3mWi3AliaAdWgw08oOvTH8D6MtPO9K4igC4wKjKr+d+O2XFdfjxk8fWz997Pz0Ufv5LY2fF6R4e/xHcCF9uJA+XEgfLqQPF9KHC+nDhfThQvpwIX24kD5cSB8upA8X0ocL6cOF9JHiAVtAtsc="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
误差继续下降,只不过不是下降趋势不如刚才,基本上也能印证直觉得出的结论是对的,响应耗时越长,误差越小。
响应时间离散系数
实际工作中响应时间都非固定的响应时间,对于某些结果,响应时间可能相差巨大,甚至好几倍的差距。下面我们来看看响应时间的离散程度对性能测试误差的影响。
我引入一个随机的(0,1]
的随机数来模拟响应时间的离散系数。
下面是20
线程、100
请求次数的模拟结果,随机休眠配置是sleep(0.1 + getRandomDouble() / 10)
,理论平均休眠时间是150ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":153,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"3.56%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":126.07160867372667,
> ① . "total":2000,
> ① . "qps":130.718954248366,
> ① . "startTime":"2021-04-05 16:06:34",
> ① . "endTime":"2021-04-05 16:06:50",
> ① . "mark":"FunTester误差分析051606",
> ① . "table":"eJztlU0KgkAYhveCd/gOoGDRygN0gOgCQgMJzRSOQS37d9nKZUfIZfcRjI7RB4EUWJo/afUNL3yzmvd5GH9UBTKs7lT0mXSZcwmC6HSMvO35sIe2Ae7QYdYgyxGgKurrrh6Tk7GQDPo2ZybMdMkc2xqBmHIN5jpnA9sSaR3pHNwWcDvLbBkd4FLj1sxsGwZuS7DIv0J/gcGxweDwMJmM8lTddzyOUhtDf4nBscYk91XSHvc+96yUIvEu844CNKVylEAV+itMJTyF6GKgHaZKrpyU2V+gemkbwfkGdfw8fvbeC9M3njvFouD3uUk23+mQYPT2v/pbhqr8wh2lGTYAgwzJkAzrxyBDMiTD+jHIkAzJsH4MMiTDPze8AjKhbpE="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
下面将随机数离散系数增加一倍,配置sleep(0.1 + getRandomDouble() / 5)
,理论平均休眠时间200ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":202,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"5.3%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":93.76465072667604,
> ① . "total":2000,
> ① . "qps":99.00990099009901,
> ① . "startTime":"2021-04-05 16:10:32",
> ① . "endTime":"2021-04-05 16:10:54",
> ① . "mark":"FunTester误差分析051610",
> ① . "table":"eJztlk0KwjAQRvdC7zAHUFAXQnsADyBeoGDAgonSKOjSf5euuvQIdul9CorHcEAUFKmxybQVEgaSVb730gmpUwGF0Z6ILpNjFl7j+Hw6nneby2EPzTqM+yHzeypbgFNx0rM6TI6GQjLoBpx5MK1JFgb+AMSEV2FW46wX+OJbxncOHgi47+U16i3gssr9qdd0XVwasNAaSbTAwmmHpWSTMWaN9YihS0uiJdZbDmFqEs2xPusRpyfRCkslk4RAXZmG4rVxNSc9Gs2jMEr0bMgtllmkzGQ/X5J8CY12Eg1l1rueJ+nzGMk6zyhxbt1oiLrYFtCiL+FRKxso/FCUcHo1oX8TcjX6z0+SavUvN+QXszK9B1SGJcCwhtbQGhaPYQ2toTUsHsMaWsNUwxsm4B0O"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
可以看到,误差明显增加了一些,下面再试试配置sleep(0.1 + getRandomDouble() / 2)
,理论休眠时间350ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":355,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"4.85%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":53.60493165371214,
> ① . "total":2000,
> ① . "qps":56.33802816901409,
> ① . "startTime":"2021-04-05 16:13:14",
> ① . "endTime":"2021-04-05 16:13:51",
> ① . "mark":"FunTester误差分析051613",
> ① . "table":"eJztlk1qwzAQhfcB32EOkEASSKE+QA5QcgFDBDFUSrESSJdtfpdZaZkjJMveR5DSY2Sg0EUJthyN5FlYPLBXet+T5GclHXAY46WaCL0Qxc/lcv06Xw+779MRhn1YzAqRTV2mgKSTlHu9CP02V1rAJJcihVVPiyLPXkEtZRfee1JM80xVeVRzyFzB71zpYDAEqbsyW6Wj5yd8JUjhNaz5QOHjgHJKQ2AT1M2aT9Q/q3CO1mxQ9+0CuVqzRZVahnB2t6V1t2aNquFLT+GJQEXicNZi0dQ+DAGJ/splj6JF8iEj3S1auhC7R0VY1t+MSO/+0XjSNruitYlpyjYqdezviYicL3YlPQu8BxOwqA7/JJxqxTMNw8rxSRTt5hEvFfuqeixZwDtr0+lYYLQJ24RtwuYx2oReCW9YS+Wj"
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
没想到反而有了点下降的趋势,我们再将离散系数增加一倍,配置sleep(0.1 + getRandomDouble())
,看一下效果。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":590,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"10.51%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":30.336584403961957,
> ① . "total":2000,
> ① . "qps":33.898305084745765,
> ① . "startTime":"2021-04-05 16:20:41",
> ① . "endTime":"2021-04-05 16:21:47",
> ① . "mark":"FunTester误差分析051620",
> ① . "table":"eJztl01qwkAYhvdC7vAdQMEfkJID9ADFCwQcMOBMS0bBLv136WqWHkGXvc+ApcfoQKkgtsn8fclEDC8kq3mfh8nMJFEDNK7nKRsQPiHZ1+l0/jied5vPwx66bZiMMpIMdYaAqBHld70Q/vbKOIFBSkkMsxYnWZqMgU1pE95blAzThBV1FGLQlMHPUHGn2wPKmzSZxZ32U189e7BwvaTYqeiYOFRsVdCbpFir/Nagtv1ZhdQoxVwltxKj+VL7fx9WuxQLFYNqvwTG5kgUdvUeKRwRvJA4ToZvIttXE5EKEcmFDB/Lmk6KlUoJaHaEZeNZUGocRpWT6p+bQRBLsVSpmNOMOkBkHfJwsQvpK9oafBkEsRbdLK7/Zepyuza57Ix1VLk1Ku1LozyruqxzQ7OarX8Tu/ubsVvDADAehg/DXMNv5swe1g=="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
这下误差增加了不少,我都开始怀疑上一次实验是否是偶然情况下才导致误差并没有升高。不过这个问题跟之后会讲到的同步结束
有关联。到时候我修复完异步结束
导致的误差增加后,在回过来重复一下离散系数这个实验。
基本结论还是,接口请求响应时间离散系数越大,误差越大。
before & after
下面进行本期最后一个环节,就是before
和after
两个方法中进行耗时操作,对误差产生的影响。其实这里不用进行试验也能得出结论,耗时越长,误差越大。原因就是在请求响应误差一定的情况下,before
和after
执行所消耗的时间,就是增加了总时间T
,请求次数相同,总时间T
除以总请求次数,QPS
肯定是降低的,再加上,QPS=T/count(req)
本身就是低QPS
计算公式,所以总的结论就是:在before
和after
方法中执行约耗时的操作,误差越大。
下面再before
中进行sleep(5)
的操作,配置20
线程,100
请求次数,固定休眠时间100ms
。
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"9.82%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":175.1006828926633,
> ① . "total":2000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 16:32:31",
> ① . "endTime":"2021-04-05 16:32:43",
> ① . "mark":"FunTester误差分析051632",
> ① . "table":"eJztz0sKwjAQgOF9IXeYA7TQuuwBPID0AoUGDJgoTQt167NLV116BLv0PoWKxzA+ltUGtODAhIEvq0l+5oDFGecq4jrj6bWu2/OpLXeX4wFGPmTTlMeJzQpgDvv81oTrxVxpDpGQPITC0zwV8QxULl1YepInIlZ9b/T/QwoFz11h4PsgtSvjIgyC+/UHFd+epirNWJW83bAy08PGjB1bMx2/aqq1GTteKzrZm7Hj8YMhYM6Ay/8CKsQPFeKHCvFDhfihQvxQIX6oED9UiB8qxA8V4ocK8UOF+KFC/FAhfphzAzQA+zM="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~```
现在讲休眠时间增加到`5s`,再看看结果。
```shell
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":103,
> ① . "failRate":0.0,
> ① . "threads":20,
> ① . "deviation":"33.29%",
> ① . "errorRate":0.0,
> ① . "executeTotal":2000,
> ① . "qps2":129.5336787564767,
> ① . "total":2000,
> ① . "qps":194.1747572815534,
> ① . "startTime":"2021-04-05 16:33:10",
> ① . "endTime":"2021-04-05 16:33:25",
> ① . "mark":"FunTester误差分析051633",
> ① . "table":"eJztz0EKgkAUgOG9MHd4B1DQVuEBOkB4AaGBBpopHAVbRlQuW7nsCLnsPoLRMRpqE4SOlIseveHB58aZ9zMHepxJpiKuU57cqqq5nJtifz0dYeRDOk94POtzBTCHdb815Xq1VJpDJCQPIfc0T0S8AJVJF9ae5DMRK9sb9j2kUPC8Kwx8H6R2ZZyHQTA2nwNUfHvqsjDTq+SfXqnLjRkLWzNvPFbo2KTlty52ZiwczLTxutGnMGeYe34XKsQPFeKHCvFDhfihQvxQIX6oED9UiB8qxA8V4ocK8UOF+KFC/DDnDnuZ/C4="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
结论符合理论值,就不进行更多验证了。
下期将分享一下,异常处理
、正则
、异步结束
和加锁资源
等因素对误差的影响,欢迎持续关注。本来打算录视频演示的。可惜时间不是很多,没法准备,以后有机会开个直播聊。