1.在我通過TCP連接(Kafka Producer)發送數據的應用程序中,當消息大小從1MB變大到100MB。 (140 MB /秒 - > 25 MB /秒)(批量大小= 1)生產者(java客戶端)在消息大小非常大時(如〜100mb)性能下降
我對生產者進程進行了概要分析,發現一個可疑點:Bits.java中的方法'copyFromArray'消耗大部分時間。 (該代碼如下。)
static final long UNSAFE_COPY_THRESHOLD = 1024L * 1024L;
static void copyFromArray(Object src, long srcBaseOffset, long srcPos,
long dstAddr, long length)
{
long offset = srcBaseOffset + srcPos;
while (length > 0) {
long size = (length > UNSAFE_COPY_THRESHOLD) ? UNSAFE_COPY_THRESHOLD : length;
unsafe.copyMemory(src, offset, null, dstAddr, size);
length -= size;
offset += size;
dstAddr += size;
}
}
參考:當我使用生產者客戶端(Java實現)http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/nio/Bits.java
2.有趣的是隻出現此問題,但是當我使用一個不會發生(scala實現),我不明白。
我應該從哪裏開始找到問題所在?
'mb' =毫比特,'MB' =兆字節。如果你有很大的消息,花費大部分時間複製數據並不罕見。我會認爲Scala調用與Java客戶端相同的代碼。 –
@PeterLawrey(我修復了MB - > MB,非常感謝。)根據分析結果,Scala客戶端調用與Java客戶端完全相同的方法。 – syko
所以你是對的,它應該以完全相同的方式執行,因爲它運行的是相同的代碼。 –