1. In meiner Anwendung, die Daten über TCP-Verbindung (Kafka Producer) sendet, beobachtete ich drastische Leistungsabfall, wenn die Größe der Nachricht wird größer von 1 MB bis 100 MB. (140 MB/s -> 25 MB/s) (Stapelgröße = 1)Producer (Java-Client) hat Leistungsabfälle, wenn die Nachrichtengröße ist sehr groß (wie ~ 100mb)
Ich profilierte den Erzeugerprozess und fand einen verdächtigen Punkt: Eine Methode 'copyFromArray' in Bits.java verbraucht die meiste Zeit. (Die Codes sind wie folgt.)
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;
}
}
Referenz: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/nio/Bits.java
2. Interessanter dieses Problem tritt nur auf, wenn ich den Hersteller-Client (Java-Implementierung) verwenden, aber tritt nicht auf, wenn ich die man verwenden (Scala-Implementierung), die ich nicht verstehen kann.
Wo soll ich anfangen zu finden, was das Problem hier ist?
'mb' = Milli-Bits,' MB' = Mega-Bytes. Es ist nicht ungewöhnlich, die meiste Zeit damit zu verbringen, Daten zu kopieren, wenn Sie sehr große Nachrichten haben. Ich hätte gedacht, dass Scala den gleichen Code wie der Java-Client aufruft. –
@PeterLawrey (Ich habe mb -> MB repariert, vielen Dank dafür.) Der Scala-Client ruft genau die gleiche Methode auf wie der Java-Client gemäß den Profilergebnissen. – syko
Sie haben also recht, dass es genau so funktionieren sollte, da es den gleichen Code ausführt. –