我有一个Spring Boot 1.2.7.RELEASE Web应用程序(与Tomcatembedded式),需要处理一个非常高的负载峰值,在一个服务器上4到5分钟〜10K连接(实际上是一个服务器集群,但这是加载一个节点就会看到)。
它真的很慢。 如果我在10秒内用JMeter打了1000个线程,但是只需要一个简单的GET请求,Thymeleaflogin页面 – 没有别的 – 平均响应速度将很快超过13秒。 该页面只是使用Thymeleaf的loginforms。
这是运行在具有RHEL7,32GB RAM(JVM堆设置为使用28GB)和4个CPU核心的虚拟机上。 这里有很多的马力,但我正努力让它在负载下作出反应。
作为一个testing,为了减less套接字和线程的数量,我在页面中注释了两个链接:
<HEAD> <!-- Other meta stuff omitted --> <!-- I commented out these next two lines --> <link rel="stylesheet" href="css/index.css"/> <link href="css/gridset.css" rel="stylesheet"/> </HEAD>
当我这样做的完全相同的负载testing,它产生了277ms的平均响应! 如果我放回去,速度慢。
所以毫不夸张地说,同样的testing的响应时间从13秒到不到0.3秒。
我试图把CSS内联,但spring抛出各种错误试图parsing它。 W3Cvalidation器显示这两个文件包含许多错误。
有人正在努力纠正错误的CSS,但我想知道什么是慢的原因是。 这是事实上,CSS是坏了,还是事实上,它是从静态地区的Tomcat服务? 我将不会有有效的CSS来重新testing几天,我正在做这个工作的枪。
我用萤火虫打了它,单个login页面在437毫秒加载。 第一个index.css文件加载158ms,gridset.css文件53ms。 然后有3张图片总共需要205ms,图片总大小为19kb。
我将在下面发布一个线程转储。 这是由New Relic产生的。
我发现一些关于Tomcat服务静态内容缓慢的信息,但是我无法想象它会如此缓慢,而其他人则说最近的Tomcat版本和httpd一样。
我主要是一个开发人员,所以在解决这个问题上的任何帮助都非常感谢,谢谢!
75% java.lang.Thread.run() :745 70% org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run() :61 70% java.util.concurrent.ThreadPoolExecutor$Worker.run() :617 70% java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor.Worker) :1127,1142 69% java.util.concurrent.ThreadPoolExecutor.getTask() :1066 69% org.apache.tomcat.util.threads.TaskQueue.poll(long, java.util.concurrent.TimeUnit) :31 69% org.apache.tomcat.util.threads.TaskQueue.poll(long, java.util.concurrent.TimeUnit) :85 69% java.util.concurrent.LinkedBlockingQueue.poll(long, java.util.concurrent.TimeUnit) :462,474,467 69% java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) :2069,2083,2078 69% java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) :215 69% sun.misc.Unsafe.park(boolean, long) :native