概述如何减lessJava的抖动?
为了解决这个问题,我创build了一个开源的Java线程相关库
当我有许multithreading交互密切的时候,它可以减less延迟和增加吞吐量。 对于单线程任务,它仍然可以减less抖动。
该程序查看System.nanoTime()之间的时间差异,并报告超过10x,000 ns的时间。
public class TimeJumPingMain { static final long IGnorE_TIME = 1000 * 1000 * 1000; // the first second to allow warmup. static final int minJump = 10; // smallest jump of 10 us. static final int mIDJump = 100; // mID size jump of 100 us. static final int bigJump = 1000; // big jump of 1 ms. public static voID main(String… args) { int[] intervalTimings = new int[1000]; int[] jumpTimings = new int[1000]; long start = System.nanoTime(); long prev = start; long prevJump = start; int jumpCount = 0; int mIDJumpCount = 0; int bigJumpCount = 0; while (true) { long Now = System.nanoTime(); long jump = (Now – prev) / 1000; if (jump > minJump && Now – start > IGnorE_TIME) { long interval = (Now – prevJump) / 1000; if (jumpCount < intervalTimings.length) { intervalTimings[jumpCount] = (int) interval; jumpTimings[jumpCount] = (int) jump; } if (jump >= mIDJump) mIDJumpCount++; if (jump >= bigJump) bigJumpCount++; prevJump = Now; jumpCount++; } prev = Now; if (Now – start > 120L * 1000 * 1000 * 1000 + IGnorE_TIME) break; } System.out.println(\”interval ustdelay us\”); for (int i = 0; i < jumpCount && i < intervalTimings.length; i++) { System.out.println(intervalTimings[i] + \”t\” + jumpTimings[i]); } System.out.printf(\”Time jumped %,d / %,d times by at least %,d us in %.1f seconds %n\”,jumpCount,mIDJumpCount,bigJumpCount,minJump,mIDJump,bigJump,(System.nanoTime() – start – IGnorE_TIME) / 1e9); } }
在我的机器上这个报告
用linux实时编程
如何在实时linux应用程序中logging数据?
在FIFO线程固定到一个核心std :: promise :: set_value不唤醒std :: future
有什么可以延迟我的select()调用?
如何使用Java ON liNUX实时读取文本文件?
Time jumped 2,905 / 131 / 20 times by at least 10 / 100 / 1,000 us in 120.0 seconds
我已经尝试过使用taskset来设置实时优先级和taskset ,尝试locking到单个内核后启动该过程,但这些并没有如我所料。
我configuration了这个盒子,把所有的中断都移到了cpu 0-3和所有进程的cpu掩码0xFF到0x0F。 在前四个步骤中,空闲〜99%,最后四个步骤闲置100.0%。
使用chrt -r 99作为根
Time jumped 673 / 378 / 44 times by at least 10 / 100 / 1,000 us in 120.0 seconds
但是,单独使用taskset -c 7 (我确定cpu7是免费的)
Time jumped 24 / 1 / 0 times by at least 10 / 100 / 1,000 us in 120.0 seconds
使用chrt – r 99 taskset -c 7
Time jumped 7 / 1 / 0 times by at least 10 / 100 / 1,000 us in 120.0 seconds
看来,尝试使用taskset后,进程已经开始不为我工作。
更广泛的问题是;
如何减lessJava进程的抖动? 有没有更多的技巧来减lesslinux上的抖动?
注意:在运行过程中没有发生GC(使用-verbosegc进行检查)
看来代码编译可能会在100 – 102 ms之后每次导致3.62 ms的延迟。 因为这个原因,我在第一秒忽略所有的热身。
从linux内核产生
为什么在/ proc / interrupts中不启用rtc中断?
C / C ++中的实时间隔
内核模块和SCHED_RR线程的优先级
如何屏蔽从linux调度程序的cpu(防止调度到该cpu的线程)?
系统抖动和JVM抖动。
对于前者,您可以在启动时使用isolcpus参数,以确保只有您的应用程序代码可以在这些cpus上运行
http://www.novell.com/support/vIEwContent.do?externalID=7009596&sliceID=1
理想情况下,你只需要对活动线程执行一个jni调用(对你自己的jni库文件),直到sched_setaffinity ,这样你就没有任何东西,只有那个线程在那里运行。
根据我的经验,系统抖动通过使用isolcpus来最小化,中断仅由特定内核处理,超线程关闭,绝对使用所有电源管理(这些都是bios选项,当它们可用于关闭所有的c状态&p状态管理),同时在屏蔽内核上运行你的应用程序。 bios的具体选项显然是特定于你的主板,所以你需要根据你的主板型号进行调查。
在系统级看另一件事是本地APIC中断(LOC,本地中断计数器)频率。 这是一个使用1kHz中断的“低延迟桌面”吗? 无论哪种方式,您都可以预期抖动会聚集在中断间隔周围
另外2我几乎不知道,但知道作为抖动的来源; 内核tlb刷新中断和用户空间tlb刷新中断。 一些RT内核提供了控制这些选项的选项,所以这可能是另一个要考虑的事情。 你也可以看看这个网站关于在RT内核上构建RT应用程序的更多提示。
总结
以上是内存溢出为你收集整理的如何减lessJava的抖动?全部内容,希望文章能够帮你解决如何减lessJava的抖动?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容