这个问题的标题代表了我主要关心的问题,但是如果您在问题部分之外阅读,您会发现一些关于我们的build立的背景。这些背景可能相关或不相关。
我们正在使用Gatling对应用程序进行压力testing,并在单台机器上运行Gatling场景。 我们发现我们的应用程序能够应付压力工具所产生的高负载; 然而,它不能应付来自实际用户的相对较低的负载。
我的问题是:什么样的操作系统/networking级别优化或简化发生在从单个机器/操作系统到应用程序的并发请求时,与来自多个机器(即使用其Web浏览器的常规用户)的并发请求?
我们有一个通过AJP坐在Apache后面的Tomcat应用程序,它通过端口80位于Citrix Netscaler后面(我们也计划把Apache排除在外,但这是另一回事)。
我们的应用程序在相对较低的负载下(在apache和tomcat之间build立了CLOSE_WAIT连接)已经停止了,我们正在进行负载testing以解决问题。 发生在我们SQLServer实例中的死锁显示频率很高,所以我们决定从那里开始。 为了复制问题并随后testing我们的修复,我们使用一台机器使用Gatling生成负载。
当我们刚开始的时候,我们能够通过使用这个工具可靠地复制死锁。 在我们做了一些优化之后,死锁就消失了,CLOSE_WAIT连接也一样。 然后我们把应用程序推到了一个我们非常高兴的地方,并且没有任何大的打嗝。
不幸的是,当修补程序应用到生产系统时,我们仍然看到了相同的原始行为。 这使我想知道,压力工具产生的负载是不是真实世界中实际发生的事情的一个好performance, 因为它来源于单一来源,而不是许多不同的客户端遍布互联网 。
单个负载生成器可能会比不同的客户端更好地完成连接池; 比如更好地使用Keepalive。 这使得更多的请求通过更less的连接。
如果涉及到循环DNS,它往往只会击中其中一个DNS目的地,而不是分散所有的负载。 一些负载平衡器根据客户端IP做出粘性决定,在这种情况下这将是静态的。
您的负载生成器可能会有一个受限制的执行池(比如200个用户),这样响应延迟会导致用户放慢速度,相对于真实世界,您有更多的用户不耐心等待其他用户完成。
没有看到您的Gatlingtesting场景,很难留下任何东西。 只是一个“盲注”:你的加特林testing不能准确地代表真实的用户,即
DNScaching。 由于IP地址在JVM级别上cachingDNS名称caching,Gatling可能仅击中一个IP地址。 根据加特林常见问题解答 :
基本上,Gatling / JVM的DNScaching必须调整。 解决scheme是将
-Dsun.net.inetaddr.ttl=0添加到命令行。
AJAX请求。 Gatling不执行客户端JavaScript,因此如果您的应用程序是基于XMLHTTP请求构build的,那么当Gatling访问该页面时,它们将不会被触发。 您将需要手动处理它们,以防您的应用程序使用某种forms的AJAX
所以我会推荐参考如何使JMeter行为更像一个真正的浏览器,并实施等效的加特林设置,如果负载testing不代表真实的生活负载,这并没有太多的意义,运行这样的testing。