快速业务通道

使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
of operation times: 11ms - 12ms   82   0 % 12ms - 13ms   250   2 % 13ms - 14ms   19   0 % 14ms - 15ms   50   0 % 15ms - 16ms   339   3 % 16ms - 17ms   889   8 % 17ms - 18ms   730   7 % 18ms - 19ms   411   4 % 19ms - 20ms   287   2 % 20ms - 30ms   1051  10 % 30ms - 40ms   504   5 % 40ms - 50ms   846   8 % 50ms - 60ms   1168  11 % 60ms - 70ms   1434  14 % 70ms - 80ms   980   9 % 80ms - 90ms   349   3 % 90ms - 100ms  28   0 % 100ms - 112ms  7    0 %

使用实时收集器显著缩短了最大操作时间,但是同时也增加了操作时间跨度。更糟的是,吞吐率大大降低。

最后一步是为工作者线程使用 RealtimeThread,而不是常规 Java 线程。我们创建一个 RealtimeThreadFactory 类,我们可以将该类提供给 Executors 服务,如清单 10 所示:

清单 10. RealtimeThreadFactory 类

import java.util.concurrent.ThreadFactory; import javax.realtime.PriorityScheduler; import javax.realtime.RealtimeThread; import javax.realtime.Scheduler; import javax.realtime.PriorityParameters; class RealtimeThreadFactory implements ThreadFactory {    public Thread newThread(Runnable r) {      RealtimeThread rtThread = new RealtimeThread(null, null, null, null, null, r);      // adjust parameters as needed      PriorityParameters pp = (PriorityParameters) rtThread.getSchedulingParameters();      PriorityScheduler scheduler = PriorityScheduler.instance();      pp.setPriority(scheduler.getMaxPriority());      return rtThread;    } }

如果将 RealtimeThreadFactory 类的一个实例传递给 Executors.newFixedThreadPool() 服务器,将导致工作者线程变为使用具有最高优先级的 FIFO 调度机制的 RealtimeThread。垃圾收集器仍然会在需要执行工作时中断这些线程,但其他较低优先级任务不会干扰工作者线程:

$ java -Xms700m -Xmx700m -Xgcpolicy:metronome -Xgcthreads8 Server 6 Handled 10000 operations in 27975 ms Throughput is 357 operations / second Histogram of operation times: 11ms - 12ms   159   1 % 12ms - 13ms   61   0 % 13ms - 14ms   17   0 % 14ms - 15ms   63   0 % 15ms - 16ms   1613  16 % 16ms - 17ms   4249  42 % 17ms - 18ms   2862  28 % 18ms - 19ms   975   9 % 19ms - 20ms   1    0 %

通过此更改,我们显著改善了最差的操作时间(降低到 19 毫秒)和总吞吐量(提升到每秒 357 个操作)。所以我们显著改善了操作时间的易变性,但是在吞吐量性能上付出了昂贵的代价。垃圾收集器的操作(使用每 10 毫秒中的至多 3 毫秒)解释了为什么通常需要约 12 毫秒的操作可改善至 4 - 5 毫秒,这也是大量操作现在需要花 16 - 17 毫秒时间的原因。吞吐量的下降可能比预期更严重,因为除了使用 Metronome 垃圾收集器,实时 JVM 还修改了预防优先级反转的锁定原语,优先级反转是使用 FIFO 调度时的一个重要问题(参见 “实时 Java,第 1 部分: 使用 Java 语言编写实时系统”)。不幸的是,主线程与工作者线程之间的同步导致了最终影响吞吐量的大量开销,但是我们没有将其作为任何操作时间的一部分来进行

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号