为了解决这个问题,我创建了一个开源 Java Thread Affinity library
当我有多个线程密切交互时,它可以减少延迟并提高吞吐量。对于单线程任务,它仍然可以减少相当多的抖动。
此程序查看调用 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 us\tdelay 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 / %,d times by at least %,d / %,d / %,d us in %.1f seconds %n",
jumpCount, midJumpCount, bigJumpCount, minJump, midJump, bigJump, (System.nanoTime() - start - IGNORE_TIME) / 1e9);
}
}
在我的机器上报告
Time jumped 2,905 / 131 / 20 times by at least 10 / 100 / 1,000 us in 120.0 seconds
我已经尝试 chrt 设置实时优先级和 taskset 尝试在启动进程后锁定到单个核心,但这些并没有像我预期的那样有帮助。
我将该框配置为将所有中断移动到 cpu 0-3,并将所有进程的 cpu 掩码从 0xFF 移动到 0x0F。在 top 中,前四个 cpu 大约是 99% 空闲,最后四个 cpu 是 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
似乎在进程开始后尝试使用任务集对我不起作用。
更广泛的问题是;
如何减少 Java 进程的抖动?还有其他减少 Linux 抖动的技巧吗?
注意:此进程运行期间不会发生 GC(使用 -verbosegc 检查)
似乎代码编译在 100 - 102 ms 之后每次可能会导致 3.62 ms 的延迟。出于这个原因,我忽略了第一秒的所有内容作为热身。
最佳答案
有系统抖动和 JVM 抖动。
对于前者,您可以在启动时使用 isolcpus 参数来确保只有您的应用程序代码可以在这些 cpus 上运行
http://www.novell.com/support/viewContent.do?externalId=7009596&sliceId=1
理想情况下,您应该只为 Activity 线程执行一个 jni 调用(对您自己的 jni 库)到 sched_setaffinity,这样您就真的只有在那里运行的线程。
根据我的经验,系统抖动可以通过使用 isolcpus 最小化,中断仅由特定内核处理,关闭超线程,并且绝对删除所有使用的电源管理(这些是 bios 选项,当它们可用于关闭所有c-state 和 p-state 管理),同时在屏蔽核心上运行您的应用程序。 BIOS 特定选项显然特定于您的主板,因此您需要根据您的主板型号进行调查。
另一个看系统级的是本地 APIC 中断(LOC,本地中断计数器)频率。这是使用 1kHz 中断的“低延迟桌面”吗?无论哪种方式,您都可以预期抖动会在中断间隔周围聚集
还有 2 个我几乎一无所知,但我知道这是抖动的来源;内核 tlb 刷新中断和用户空间 tlb 刷新中断。一些 RT 内核提供了控制这些选项的选项,因此这可能是另一回事。也可以看看this site有关在 RT 内核上构建 RT 应用程序的更多提示。
关于java - 如何减少 Java 的抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140407/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解