2017-08-21 8 views
9

私は、System.nanoTime()が他のOSより遅い理由についての投稿を見て読んだことがありますが、今見ている違いは何も見たことがありません。 JMHを使用して、私はこのベンチマークを実行しています。 (注:System.nanoTime()も使用します)Centos 7、WindowsよりSystem.nanoTimeの速度が400倍遅い

@Benchmark 
public long systemNanoTime() { 
    return System.nanoTime(); 
} 

Windows 10では、これは約25 nsです。

CentOS 7では、Linux 3.10では〜10293 nsと測定されます。

これは、同じマシン上で、インテル(R)Core(TM)i7-7820XのCPU @ 3.60GHzの

JDKは、システムクロックを取得する方法を変更するためのオプションがありますか?


EDIT:トッドによって提供されたリンクに基づいて、それが表示されるTSCは、レイテンシが改善したが、依然と悪い

echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource 

を実行した後に

# more /sys/devices/system/clocksource/clocksource0/* 
:::::::::::::: 
/sys/devices/system/clocksource/clocksource0/available_clocksource 
:::::::::::::: 
hpet acpi_pm 
:::::::::::::: 
/sys/devices/system/clocksource/clocksource0/current_clocksource 
:::::::::::::: 
hpet 

使用できません。レイテンシは1,816nsです。

私は、TSCクロックソースをCentosに追加できるかどうかを確認しようとしましたが、運がまだありません。


EDIT:@のapanginの提案に基づいて、さらに少し

# dmesg | grep -i tsc 
[ 0.000000] tsc: Detected 3600.000 MHz processor 
[ 0.058602] TSC deadline timer enabled 
[ 0.065868] TSC synchronization [CPU#0 -> CPU#1]: 
[ 0.065870] Measured 679995254538 cycles TSC warp between CPUs, turning off TSC clock. 
[ 0.065874] tsc: Marking TSC unstable due to check_tsc_sync_source failed 
[ 125.451480] Override clocksource tsc is not HRT compatible. Cannot switch while in HRT/NOHZ mode 
+0

このブログ記事をチェックしましたか?それはあなたが見ているもののいくつかを説明し、よく研究されているようです。 http://pzemtsov.github.io/2017/07/23/the-slow-currenttimemillis.html – Todd

+2

ファームウェアのバグのようです。私は新しいカーネル(4.10のような)でtsc同期パッチを見たと思う。 – apangin

答えて

6

を掘り、私は最新バージョン

http://elrepo.org/tiki/tiki-index.php

とCentOSのための代替リポジトリを追加することで、このページを踏襲し、それ以上の指示に従ってください

https://www.tecmint.com/install-upgrade-kernel-version-in-centos-7/インストールし、カーネルを示唆

# $ dmesg | grep -i tsc 
[ 0.001000] tsc: Detected 3600.000 MHz processor 
[ 0.001000] [Firmware Bug]: TSC ADJUST: CPU0: -2100392876408 force to 0 
[ 0.046075] TSC deadline timer enabled 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU1: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU2: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU3: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU4: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU5: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU6: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU7: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU8: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU9: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU10: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU11: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU12: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU13: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU14: 0 
[ 0.001000] [Firmware Bug]: TSC ADJUST differs: Reference CPU0: -2100392876408 CPU15: 0 
[ 1.337843] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x6c1bafbc2ab, max_idle_ns: 881591058496 ns 
[ 2.353636] clocksource: Switched to clocksource tsc 

を再起動した後にファームウェアのバグのために調整されます。

もう一度テストを実行すると、System.nanoTime()を使用して平均レイテンシが40nsになり、これは260倍の改善です。また、この指標を使用したベンチマークはより意味があることを意味します。

関連する問題