簡體   English   中英

當消息大小非常大(如 ~100mb)時,生產者(java 客戶端)性能下降

[英]Producer (java client) has performance drops when message size is very huge (like ~100mb)

1.在我通過 TCP 連接(Kafka Producer)發送數據的應用程序中,當消息大小從 1MB 增大到 100MB 時,我觀察到性能急劇下降。 (140 MB/秒 --> 25 MB/秒)(批量大小 = 1)

我分析了生產者進程並發現了一個可疑點: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;
    }
}

參考: http : //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/nio/Bits.java

2.有意思的是這個問題只在我用producer客戶端(java實現)的時候出現,我用一個(scala實現)就沒有出現,我看不懂。

我應該從哪里開始找到這里的問題?

Kafka 的最佳消息大小約為 1k。 如果您的消息大小大於 10M,您就會開始遇到性能問題。 在您的情況下,消息大小約為 100MB。 這絕對是一個不不。

你必須問問自己是否有必要發送這么大的信息。 Kafka 是一個事件發布-訂閱系統,而不是一個 FTP 服務器。 如果您需要發送大文件,您可以將文件放在共享位置,然后通過 Kafka 將 url 作為消息發送。 如果這不起作用,另一種解決方法是編碼您的生產者以使用相同的密鑰將大消息分成多個部分。 這樣您就可以保證具有相同鍵的消息最終會出現在同一個分區上。 您可以在消費者端組裝消息。 此外,使用壓縮將減小消息的大小以提高性能。

簡而言之,您應該避免通過 Kafka 發送大消息(> 10M)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM