EC2はxenで動いていて、clocksourceもxen
になっています。gettimeofday
はvDSO
という仕組みによってユーザーランドで実行してくれまうが、clocksourceがxen
だとカーネルランドで実行されてしまいます。
例えばJavaでSystem.currentTimeMillis
やSystem.nanoTime
をループで実行する処理を書いてstraceを見てみると、大量のシステムコールが実行されているのが観測できます。(gettimeofday
, clock_gettime
)
clocksourceはtsc
に変更すると良いぞという情報はあるのですが、一方で危険なので変更すべきでは無いという情報もあります。
AWSのサポートに聞いたときは、新しめのInstance(C4)と新しめのAMIだったら大丈夫だよと言われたのですが、変更するとちょこちょこKernelメッセージ出るし、収益に直結しているサービスに投入するのも怖い。
というわけで、staging環境ではやってみたんだけど、productionには投入できていません。