史上最强Tomcat8性能优化(下)

设置nio2的运行模式将最大线程设置为500进行测试:
从测试结果可以看到 , 平均响应时间有缩短 , 吞吐量有提升 , 可以得出结论:nio2的性能要高于nio 。
参数说明与最佳实践具体参数参考官网说明
执行器参数说明(加粗是重点)AttributeDescriptionthreadPriority (优先级)(int) 执行程序中线程的线程优先级 , 默认值为 5(Thread.NORM_PRIORITY常量的值)daemon(守护进程)(布尔) 线程是否应该是守护程序线程 , 默认值为 truenamePrefix(名称前缀)(String) 执行程序创建的每个线程的名称前缀 。 单个线程的线程名称将为namePrefix+threadNumbermaxThreads(最大线程数)(int) 此池中活动线程的最大数量 , 默认为 200minSpareThreads(最小活跃线程数)(int) 始终保持活动状态的最小线程数(空闲和活动) , 默认值为 25maxIdleTime(空闲线程等待时间)(int) 空闲线程关闭之前的毫秒数 , 除非活动线程的数目小于或等于minSpareThreads 。 默认值为60000(1分钟)maxQueueSize(最大的等待队里数 , 超过则请求拒绝)(int) 在我们拒绝执行之前可以排队等待执行的可运行任务的最大数量 。 默认值为Integer.MAX_VALUEprestartminSpareThreads(是否在启动时就生成minSpareThreads个线程)(boolean) 在启动执行程序时是否应启动minSpareThreads , 默认值为 falsethreadRenewalDelay(重建线程的时间间隔)(long) 如果配置了ThreadLocalLeakPreventionListener , 它将通知该执行程序已停止的上下文 。 上下文停止后 , 池中的线程将更新 。 为避免同时更新所有线程 , 此选项设置了任意两个线程之间的延迟 。 该值以毫秒为单位 , 默认值为1000ms 。 如果值为负 , 则不更新线程 。
执行器最佳实践此最佳配置仅供参考
连接器参数说明可以看到除了这几个基本配置外并无特殊功能 , 所以我们需要对 Connector 进行扩展 。
其中Connector 支持参数属性可以参考Tomcat官方网站 , 本文就只介绍些常用的 。
通用属性(加粗是重点)AttributeDescriptionallowTrace如果需要服务器能够处理用户的HAED/TRACE请求 , 这个值应该设置为true , 默认值是falseasyncTimeout默认超不时候以毫秒为单位的异步恳求 。 若是没有指定 , 该属性被设置为10000(10秒)enableLookups设置为true是否要调用以 request.getRemoteHost()执行DNS查找以返回远程客户端的实际主机名 。 设置为false跳过DNS查找并改为以字符串形式返回IP地址(从而提高性能) 。 默认情况下 , DNS查找被禁用 。 maxHeaderCount容器允许的请求头字段的最大数目 。 请求中包含比指定的限制更多的头字段将被拒绝 。 值小于0表示没有限制 。 如果没有指定 , 默认设置为100 。 maxParameterCount将被容器自动解析的最大数量的参数和值对(GET加上POST) 。 参数值对超出此限制将被忽略 。 值小于0表示没有限制 。 如果没有指定 , 默认为10000 。 请注意 ,FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求 。 maxPostSize容器FORM URL参数解析将处理的POST的最大大小(以字节为单位) 。 可以通过将此属性设置为小于零的值来禁用该限制 。 如果未指定 , 则此属性设置为2097152(2兆字节) 。 请注意 ,FailedRequestFilter 可以使用拒绝超过此限制的请求 。 maxSavePostSize将被容器在FORM或CLIENT-CERT认证中保存/缓冲的POST的最大尺寸(以字节为单位) 。 对于这两种类型的身份验证 , 在用户身份验证之 前 , POST将被保存/缓冲 。 对于POST CLIENT-CERT认证 , 处理该请求的SSL握手和缓冲清空期间 , POST将被缓存 。 对于Form认证 , POST将被保存 , 同时用户将被重定向到登陆 表单 。 POST将被一直保留直到用户成功认证或者认证请求关联的会话超时 。 将此属性设置为-1可以禁用此限制 。 将此属性设置为0 , POST数据在身份验证 过程中将不被保存 。 如果没有指定 , 该属性设置为4096(4千字节) 。 parseBodyMethods以逗号分隔的HTTP方法列表 , 通过方法列表 , 等同于POST方法 , request 正文将被解析成请求参数 。 这在RESTful应用程序要支持以POST式的语义解析PUT请求中是非常有用的 。 需要注意的是设置其他值(不是POST)会导致Tomcat的行为违反servlet规范的目的 。 在这里为了符合HTTP规范明确禁止HTTP方法TRACE 。 默认值是POSTport连接器 将在其上创建服务器套接字并等待传入连接的TCP端口号 。 您的操作系统将仅允许一个服务器应用程序侦听特定IP地址上的特定端口号 。 如果使用特殊值0(零) , 则Tomcat将随机选择一个空闲端口用于此连接器 。 这通常仅在嵌入式和测试应用程序中有用 。 protocol设置协议以处理传入流量 。 默认值为 HTTP/1.1使用自动切换机制选择基于java NIO的连接器或基于APR / native的连接器 。 如果PATH(Windows)或LD_LIBRARY_PATH(在大多数Unix系统上)环境变量包含Tomcat本机库 , 并且APRLifecycleListener用于初始化APR的库的useAprConnector属性设置为 true , 则将使用APR /本机连接器 。 如果找不到本机库或未配置属性 , 则将使用基于Java NIO的连接器 。 请注意 , APR /本机连接器的HTTPS设置与Java连接器的设置不同 。 要使用显式协议而不是依赖于上述自动切换机制 , 可以使用以下值:org.apache.coyote.http11.Http11NioProtocol-非阻塞Java NIO连接器org.apache.coyote.http11.Http11Nio2Protocol-非阻塞Java NIO2连接器-APRorg.apache.coyote.http11.Http11AprProtocol/本地连接器 。 也可以使用自定义实现 。 看看我们的连接器比较表 。 对于Java和Java连接器 , http和https的配置相同 。 有关APR连接器和特定于APR的SSL设置的更多信息 , 请访问APR文档proxyName如果这个连接正在使用的代理服务器配置 , 配置该属性指定的服务器的名称 , 可以调用request.getServerName()返回 。 有关更多信息 , 请参见代理支持 。 proxyPort如果这个连接正在使用的代理服务器配置 , 配置该属性指定服务器端口 , 可以调用request.getServerPort()返回 。 有关更多信息 , 请参见代理支持 。 redirectPort如果该连接器支持非SSL请求 , 并且接收到的请求为满足安全约束需要SSL传输 ,Catalina 将自动将请求重定向到指定的端口号 。 scheme将该属性设置为你想调用request.getScheme()返回的协议的名称 。 例如 , 对于SSL连接器 , 你会将此属性设置为“HTTPS ” 。 默认值是“ HTTP ” 。 secure如果你想调用request.isSecure()收到此连接器的请求返回true , 请该该属性设置为true 。 您希望SSL连接器或非SSL连接器接收数据通过一个SSL加速器 , 像加密卡 , SSL设备 , 甚至一个web服务器 。 默认值是假的 。 URIEncoding解决我们的乱码问题 , 这将指定使用的字符编码 , 来解码URI字符 。 如果没有指定 , ISO-8859-1将被使用 。 useBodyEncodingForURI这指定是否应该用于URI查询参数 , 而不是使用URIEncoding contentType中指定的编码 。 此设置兼容性Tomcat 4.1.x版(该版在contentType中指定编码 , 或者使用request.setCharacterEncoding的方法显式设置(参数为 URL传来的值) 。 默认值false 。 useIPVHosts将该属性设置为true会导致Tomcat使用收到请求的IP地址 , 来确定将请求发送到哪个主机 。 默认值是假的 。 xpoweredBy将此属性设置为true会导致Tomcat支持使用Servlet规范的通知 , (在规范中推荐使用头字段) 。 默认值是假的 。