前面想着升級一下springboot2.2.6 ,下午做一個小試驗打了一點壓力到springboot服務,發現報了異常:
More than the maximum allowed number of headers, [100]
java.lang.IllegalArgumentException: Request header is too large
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
超過允許的最大值【100】?【too large】?【VM limit】?,整幾個異常以前也見過,沒有太在意,但是壓力稍微一上去,就會出現這個異常並且服務就會卡住不接受任何數據,查查源碼看看。。。
java.lang.IllegalStateException: More than the maximum allowed number of headers, [100], were detected.
at org.apache.tomcat.util.http.MimeHeaders.createHeader(MimeHeaders.java:260) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.http.MimeHeaders.addValue(MimeHeaders.java:304) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:833) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:584) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:283) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_242]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_242]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242]
org.apache.coyote.AbstractProtocol.java中;默認值是100呀,怪不得一直打不上去,知道原因就好辦了;
private int maxHeaderCount = 100;
public int getMaxHeaderCount() {
return maxHeaderCount;
}
public void setMaxHeaderCount(int maxHeaderCount) {
this.maxHeaderCount = maxHeaderCount;
}
可以在項目中增加一個類:
package daopinz.sample;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Description: TODO(這裏用一句話描述這個類的作用)
* @Author daopinz
* @Date 2020/5/11 13:59
*/
@Configuration
public class TomcatCustomizer {
@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setProtocol("org.apache.coyote.http11.Http11NioProtocol");
factory.setPort(8850);
factory.addConnectorCustomizers( connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setDisableUploadTimeout(false);
//protocol.setAcceptCount(200);
//protocol.setMaxConnections(200);
protocol.setMaxHeaderCount(20000);
protocol.setConnectionTimeout(20000);
protocol.setMaxHttpHeaderSize(209715200);
protocol.setMaxSavePostSize(4194304);
} );
return factory;
}
}
同時在配置文件中修改配置(application.yml):
server:
port: 8850
max-http-header-size: 209715200
tomcat:
accept-count: 200
max-connections: 200
max-http-post-size: 200
max-http-header-size: 209715200
這樣修改之後,重新打包並重啓服務,就會發現可以接收的數據量讓你驚訝,原來這裏修改後,可以承受好大的數據啊!!!
下面的兩個異常,也會乖乖的 '繳械投降' 啦!
java.lang.IllegalArgumentException: Request header is too large
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:741) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:824) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:584) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:283) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_242]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_242]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242]
2020-05-11 07:02:14.987 ERROR 1 --- [nio-8850-exec-2] o.a.coyote.http11.Http11NioProtocol : Failed to complete processing of a request
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57) ~[na:1.8.0_242]
at java.nio.ByteBuffer.allocate(ByteBuffer.java:335) ~[na:1.8.0_242]
at org.apache.coyote.http11.Http11OutputBuffer.<init>(Http11OutputBuffer.java:107) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.Http11Processor.<init>(Http11Processor.java:162) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.http11.AbstractHttp11Protocol.createProcessor(AbstractHttp11Protocol.java:990) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) ~[tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_242]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_242]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar!/:9.0.33]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242]
2020-05-11 07:02:15.043 ERROR 1 --- [nio-8850-exec-3] o.a.coyote.http11.Http11NioProtocol : Failed to complete processing of a request
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
2020-05-11 07:02:20.047 ERROR 1 --- [nio-8850-exec-4] o.a.coyote.http11.Http11NioProtocol : Failed to complete processing of a request
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
2020-05-11 07:02:35.052 ERROR 1 --- [nio-8850-exec-5] o.a.coyote.http11.Http11NioProtocol : Failed to complete processing of a request
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
2020-05-11 07:02:35.113 ERROR 1 --- [nio-8850-exec-6] o.a.coyote.http11.Http11NioProtocol : Failed to complete processing of a request
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
最後還是想貼一下改完之後,服務端平均一秒內處理了多少條數據。。。(●ˇ∀ˇ●),1700/s ! ! !
2020-05-11 07:10:00.033 [nio-8850-exec-7] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.088 [nio-8850-exec-8] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.142 [nio-8850-exec-9] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.196 [io-8850-exec-10] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.249 [nio-8850-exec-1] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.304 [nio-8850-exec-2] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.364 [nio-8850-exec-3] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.421 [nio-8850-exec-4] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.514 [nio-8850-exec-5] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.584 [nio-8850-exec-6] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.653 [nio-8850-exec-7] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.706 [nio-8850-exec-8] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.763 [nio-8850-exec-9] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.817 [io-8850-exec-10] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.880 [nio-8850-exec-1] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.933 [nio-8850-exec-2] daopinz.sample.CallbackController: payload about has: 100
2020-05-11 07:10:00.990 [nio-8850-exec-3] daopinz.sample.CallbackController: payload about has: 100