2

私は非常に「単純な」テストを実行しています。

@Fork(value = 1, jvmArgs = { "--illegal-access=permit", "-Xms10G", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints", "-XX:ActiveProcessorCount=7",
        "-XX:+UseNUMA"
        , "-XX:+UnlockDiagnosticVMOptions", "-XX:DisableIntrinsic=_currentTimeMillis,_nanoTime",

        "-Xmx10G", "-XX:+UnlockExperimentalVMOptions", "-XX:ConcGCThreads=5", "-XX:ParallelGCThreads=10", "-XX:+UseZGC", "-XX:+UsePerfData", "-XX:MaxMetaspaceSize=10G", "-XX:MetaspaceSize=256M"}
)
    @Benchmark
    public String generateRandom() {
        return UUID.randomUUID().toString();
    }

ランダムを使用するため、それほど単純ではないかもしれませんが、Javaを使用した他のテストでも同じ問題が発生します

自宅のデスクトップで

Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 12 Threads (hyperthreading enabled ), 64 GB Ram, "Ubuntu" VERSION="20.04.2 LTS (Focal Fossa)"
Linux homepc 5.8.0-59-generic #66~20.04.1-Ubuntu SMP Thu Jun 17 11:14:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

7 スレッドでのパフォーマンス:

Benchmark                                            Mode  Cnt        Score       Error   Units
RulesBenchmark.generateRandom                       thrpt    5  1312295.357 ± 27853.707   ops/s

ホームで 7 スレッドの AsyncProfiler 結果を使用したフレーム グラフ ここに画像の説明を入力

Oracle Linux に問題があります

Linux  5.4.17-2102.201.3.el8uek.x86_64 #2 SMP Fri Apr 23 09:05:57 PDT 2021 x86_64 x86_64 x86_64 GNU/Linux
Intel(R) Xeon(R) Gold 6258R CPU @ 2.70GHz with 56 Threads(hyperthreading disabled, the same when enabled and there is 112 cpu threads ) and 1 TB RAM I have half of performance (Even increasing threads) NAME="Oracle Linux Server" VERSION="8.4"

1つのスレッドで、私は非常に優れたパフォーマンスを発揮します:

Benchmark                                            Mode  Cnt        Score      Error   Units
RulesBenchmark.generateRandom                       thrpt    5  2377471.113 ± 8049.532   ops/s

AsyncProfiler を使用したフレーム グラフの結果は 1 スレッドです ここに画像の説明を入力 が、7 スレッドを使用

Benchmark                                            Mode  Cnt       Score       Error   Units


RulesBenchmark.generateRandom                       thrpt    5  688612.296 ± 70895.058   ops/s

AsyncProfiler Result 7 スレッドを使用したフレーム グラフ

ここに画像の説明を入力

2 つのソケットがあり、システムが 1 つの NUMA ノードのみで構成されているため、NUMA の問題である可能性があります numactl --hardware

available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
node 0 size: 1030835 MB
node 0 free: 1011029 MB
node distances:
node   0 
  0:  10 

ただし、次を使用していくつかのCPUスレッドを無効にした後:

for i in {12..55}
do
 # your-unix-command-here
  echo '0'| sudo tee /sys/devices/system/cpu/cpu$i/online
done

パフォーマンスはほとんど改善されませんでした。

これは非常に「単純な」テストです。実際のコードを使った複雑なテストでは, それも価値があります. 多くの時間を費やします..annobin___pthread_cond_signal.start

また、自宅のデスクトップに同じバージョンの vagrant イメージOracle Linuxとカーネル バージョンを展開し、10 個の CPU スレッドで実行しました。パフォーマンスは、デスクトップとほぼ同じ (~1M オペレーション/秒) でした。つまり、OSやカーネルではなく、いくつかの構成についてです

いくつかの jDK バージョンとベンダー (jdk 11 以降) でテスト済み。YUM ディストリビューションのOpenJDK 11 を使用すると、パフォーマンスはほとんど低下しませんが、重要ではありません。

アドバイスをいただけますか よろしくお願いします

4

1 に答える 1