That's a good bet. Running with a few different buffer sizes would verify this. Adjusting other settings (e.g. max in flight requests, as mentioned earlier) could also affect latency and throughput.
-Ewen On Thu, Jul 16, 2015 at 5:20 AM, Yuheng Du <yuheng.du.h...@gmail.com> wrote: > Hi Ewen, > > Thank you for your patient explaining. It is very helpful. > > Can we assume that the long latency of ProducerPerformance comes from > queuing delay in the buffer and it is related to buffer size? > > Thank you! > > best, > Yuheng > > On Thu, Jul 16, 2015 at 12:21 AM, Ewen Cheslack-Postava <e...@confluent.io > > > wrote: > > > The tests are meant to evaluate different things and the way they send > > messages is the source of the difference. > > > > EndToEndLatency works with a single message at a time. It produces the > > message then waits for the consumer to receive it. This approach > guarantees > > there is no delay due to queuing. The goal with this test is to evaluate > > the *minimum* latency. > > > > ProducerPerformance focuses on achieving maximum throughput. This means > it > > will enqueue lots of records so it will always have more data to send > (and > > can use batching to increase the throughput). Unlike EndToEndLatency, > this > > means records may just sit in a queue on the producer for awhile because > > the maximum number of in flight requests has been reached and it needs to > > wait for responses for those requests. Since EndToEndLatency only ever > has > > one record outstanding, it will never encounter this case. > > > > Batching itself doesn't increase the latency because it only occurs when > > the producer is either a) already unable to send messages anyway or b) > > linger.ms is greater than 0, but the tests use the default setting that > > doesn't linger at all. > > > > In your example for ProducerPerformance, you have 100 byte records and > will > > buffer up to 64MB. Given the batch size of 8K and default producer > settings > > of 5 in flight requests, you can roughly think of one round trip time > > handling 5 * 8K = 40K bytes of data. If your roundtrip is 1ms, then if > your > > buffer is full at 64MB it will take you 64 MB / (40 KB/ms) = 1638ms = > 1.6s. > > That means that the record that was added at the end of the buffer had to > > just sit in the buffer for 1.6s before it was sent off to the broker. And > > if your buffer is consistently full (which it should be for > > ProducerPerformance since it's sending as fast as it can), that means > > *every* record waits that long. > > > > Of course, these numbers are estimates, depend on my having used 1ms, but > > hopefully should make it clear why you can see relatively large > latencies. > > > > -Ewen > > > > > > On Wed, Jul 15, 2015 at 1:38 AM, Yuheng Du <yuheng.du.h...@gmail.com> > > wrote: > > > > > Hi, > > > > > > I have run the end to end latency test and the producerPerformance test > > on > > > my kafka cluster according to > > > https://gist.github.com/jkreps/c7ddb4041ef62a900e6c > > > > > > In end to end latency test, the latency was around 2ms. In > > > producerperformance test, if use batch size 8196 to send 50,000,000 > > > records: > > > > > > >bin/kafka-run-class.sh > > org.apache.kafka.clients.tools.ProducerPerformance > > > speedx1 50000000 100 -1 acks=1 bootstrap.servers=192.168.1.1:9092 > > > buffer.memory=67108864 batch.size=8196 > > > > > > > > > The results show that max latency is 3617ms, avg latency 626.7ms. I > wanna > > > know why the latency in producerperformance test is significantly > larger > > > than end to end test? Is it because of batching? Are the definitons of > > > these two latencies different? I looked at the source code and I > believe > > > the latency is measure for the producer.send() function to complete. So > > > does this latency includes transmission delay, transferring delay, and > > what > > > other components? > > > > > > > > > Thanks. > > > > > > > > > best, > > > > > > Yuheng > > > > > > > > > > > -- > > Thanks, > > Ewen > > > -- Thanks, Ewen