jetty服务器性能调整过程分析

所需积分/C币:45 2012-07-27 15:12:18 433KB PDF

jetty服务器性能调整过程分析
.目标 letty采用了 nio+threadpool的技术来实现高并发场景下的高性能服务器。本文的目的通过对 jet¥y参数的调整来测试其性能表现,以及得出种通用的服务端程序调优的思路。 二.Jety关键实现 1. Acceptor 用」接收客户端的连接,并将连接扔到并发队列中 关键代码 Socket channel channel acceptChannel. accept()i channel. configureBlocking(false)i Socketsocket channel, socke=(i configure(socket) manager. register(channel)i 这里的标红处正式将接受的连接打到了并发队列中,其具体实现为: hanges. add(chance)i 2. ThreadPool 用」并发处理业务逻辑,减少线程创建和销毁的开销 其具体接口为 ThreadPool bool ●jin ant ●aetI丑 tHreads0 o isLowOnThreads O: boolean 方法具体说明可以査看源代码中的注释,比较容易理解。 通常当有业务逻辑需要处理的时候就会调用 dispatch方法进行提交。常见代码如下 if (change instanceof Runnable) dispatch((Runnable)change)i Thread901在jet-y中有以下几个实现: Executorthreadecc1:使用 Threadeco1 Executor来实现线程池 ol dqueuedThreadPool:把任务提交到队列,可以重用空闲的线程来干活,假如排队拿不到 就会创建新线程来干活 QueuedThreadPool:把仟务提交到队列,空闲的线稈过了一段指定时间就会自动销毁。 不管如何,线程池有以下几个主要参数 maxid1 e TimeS:最大空闲时间 maxthreads:最大线程数 minthread:最小线程数 maxQueued:工作队列最大值 附上 jetty的服务器代码架构 onnector 一m, selector Manager ThreadPool Selectchanne connector t aacepbcrs=l Connector 5electorManager ceptor Selectset Selector 根据 acceptor数循环调用 server /selectchannelconnector /SelectorManager /Threadpool 1:丈art 2: dosclocto 3: dispatch 向程池提交任务低r操作 启动线程池,启动 Acceptor线程 线程池大小可配置 .调整方法 我们假如一个请求需要花费的时间为2C0ms,那么1个线程在1秒内可以处理该请求人约为 1000/200-5次 邦么我们可以推算出服务器t。s和线程数之间的关系为 Ips=1000/每次请求响应时间(ms)*线程池大小 四.实战 首先准备我们的服务端代码: public class Snippet i public static void main(String[] args) throws Exception I Server server new Server(8080)i SelectchannelConnector sc =(Select channelCcnnector server. getConnectors()[O] SC. setAcceptors(1)i int maxThreads - 10 int minThreads raxThreadsi QueuecThreadPool pool = new QueuedThreadPool (maxThreads) pool. setMinThreads(minThreads server. setThreadPocl(pool HelloHandler context new HelloHandler ()i server, setHandler(context) server start ()i server. join() public class HelloHandler extends AbstractHandler i public void handle (string target, Request baseRequest Httpservletrequest request H-tpservletresponse response throws I○ Exception Servletexception i try i Thread. sleep(200);//模拟响应时间需要200ms catch (InterruptedException e)( / TODO Auto-generated catch block e printstackTrace()i respcnse setContentType("text/html charset=utf-8") responsesetstatus(httpservletresponse.ScOk)i baseRequest. setHandled(true)i respcnse. getWriter().printin(<h1>Hello World</h1>)i 接下来使是我们的测试过程 首先将 maxThreads和 minthreads设置为一样 第一次测试将 maxThreads设置为10.那么根据刚才的公式,tps应该可以达到50左右。 用ab进行测试 lab-n10000-c5chttp://x.x.x.x:8080/ Server Software Jetty(7.3.1.v20110307) Server hostname Server Port 8080 Document path Document length: 22 bytes Concurrency level 50 Time taken for tests: 253.982028 seconds Complete requests: 10000 Failed requests: W≌ lte errors: Total transferred 132000C bytes HTML transferred: 220000 bytes Requests per second: 39.37 [t/sec] (mean) Time per request 1269.910[ms](ean Time per request: 25.398 [ms](mean, across all concurrent requests) Transter rate 5.08 [Kbytes/sec] received Connection Times (ms) lin mean[t/-sd] medi an max Connect: Processing:203126674.712491438 Waiting: 202126574.712491436 Total 233126674.7 91438 这甲看出-ps为39.37.除去一些服务器内部损耗,接近理论倌50.那么我们讲线程池调到20 可以推算出理论值为100,实际值大概在78左右。 Server software Jetty(7.3.1.v20110307) Server hostname X,父,X,X Server port 8080 Document path Document Length 22 bytes Concurrency level: 50 Time taken for tests: 127.8173 seconds Complete requests: 10000 Failed requests W≌i- e errors: Total transferred: 132000c bytes HTMI transferred 220000 bytes Requests per second 78.74[井/sec](mean T⊥ me per request 635.041[ms](mean) ① ime per request: 12.701 [ms] (mean, across all concurrent requests) Transfer rate 10.15 [Kbytes/sec] received Connection Times(ms) min mean[+/-sd median max Connect 00.7 essing:19563364.16233560 Waiting 19563264.16223559 ①ota1: 19663364.1 3560 结果的确为78.74与分析一致。 我们再将线程数调到50,看是否可以达到200左右的tps. Server software Jetty(7.3.1.v20110307) Server hostname K X.X.X Server port 8080 Document Path document Length: 22 bytes Concurrency level: Time taken for tests: 42.508012 seconds Complete requests 10000 Failed requests: Write errors Total transferred 132000c oytes HTMI transferred 220000by-es Requests per second: 235. 25 [+/sec](mean) Time per request: 212.540[ms](mean) Time per request 4.2.[ms](mean, across all concurrent requests Transfer rate 30.32 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd median max Connect 00.7 Processing: 8421127.2203 Waiting: 18321027.2203 459 Total 13421127. 203 460 果然达到了235.25,而且响应时间也降下来了 然后我们再调到100 Server Software Jetty(7.3.1.V20110307) Server hostname Server Port 8080 Document path Document length: 22 bytes Concurrency level 50 Time taken for tests: 127.186195 seconds Complete requests: 10000 Failed requests: W≌ lte errors: Total transferred 132000C bytes HTM transferred 220000 bytes Requests per second: 78.62 [t/sec] (mean Time per request 635.931[ms](mean) Time per request: 12.719 [ms](mean, across all concurrent requests) Transter rate 10.13 [Kbytes/sec] received Connection Times (ms) lin mean[+/-sd] median max Connect: Processing:20263337.56248 Waiting: 20263337.5624811 Total 3363337.5 624 812 这个时候发现性能开始下降的厉害。由此可见,我这台机器的最高可调线程人小应该在50-100 之间,具体多少这里省略步骤了。 五,结论 由此可见性能调优的过程龈解小学应用题类似,需要找到各个影响点之间的关系,并且列出公式, 通过实践来验证你的理论 例如这里的最小线程池大小应该可以调节为你系统平均的并发数大小,应为不可能你的系统每时 每刻处于高峰,其他参数也类似。大家有兴越可以进行白己的推算和论证。

...展开详情
试读 9P jetty服务器性能调整过程分析

评论 下载该资源后可以进行评论 5

a416140671 不错,再下一次看看
2018-02-06
回复
bangbanglovett 不错的资料,可以参考
2017-01-08
回复
aimiyano 不错的资料,可以参考
2016-08-02
回复
ying4004 是份不错的参考资料,谢谢分享
2016-06-16
回复
九尾狐0813 感谢分享, 对我的帮助很大
2015-11-26
回复
img
wujuan321

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐
    jetty服务器性能调整过程分析 45积分/C币 立即下载
    1/9
    jetty服务器性能调整过程分析第1页
    jetty服务器性能调整过程分析第2页
    jetty服务器性能调整过程分析第3页

    试读已结束,剩余6页未读...

    45积分/C币 立即下载 >