Your producer test uses a thread per core. Your consumer test uses a single thread. A single thread is likely insufficient to get maximum throughput. On Aug 30, 2013 8:46 AM, "Rafael Bagmanov" <bugzma...@gmail.com> wrote:
> Bejamin, do you mean thread on a client side? I'm not quite getting > what I'm limited with. Can you please explain little bit more? > > A single threaded producer is still capable of doing 50 MB/s on > hi1.4xlarge. > Which is quite slower than 377 MB/s from single job of FIO. But still > 5 times faster than what I'm getting from consumer. > Is it as expected to be? > > Another mystery for me is that in case of hot IO cache (whole topic is > in memory): I'm getting 50 MB/s - 100 MB/s (this huge std. dev. bugs > me too) from a single threaded consumer. > > And when cache is cold, I'm not seeing that kafka broker making best > possible from SSD it has. > I've tried setting fetch-size to 100 MB, but still kafka hits disk > with 10 MB/s. (the disk by itself can satisfy much more read requests > with same latency and provide much higher throughput). > > For me it looks as if > http://man7.org/linux/man-pages/man2/sendfile.2.html somehow works > inefficiently with SSD. And I don't understand why and how can this be > fixed. > > I do understand that you advising me to use more partitions and more > consumer threads. But I would like to know the limits I'm hitting with > this single threaded mode. > > Thanks! > > Rafael Bagmanov, > Grid Dynamics > > 2013/8/30 Benjamin Black <b...@b3k.us>: > > You are maxing out the single consumer thread. > > On Aug 30, 2013 1:35 AM, "Rafael Bagmanov" <bugzma...@gmail.com> wrote: > > > >> Hi, > >> > >> I am trying to understand how fast is kafka 0.7 compared to what I can > get > >> from hard drive. In essence I have 3 questions. > >> > >> In all tests below, I'm using single broker with single one-partitioned > >> topic. Kafka perf tests have been run in 2 deployment configs: > >> - broker, perf-test on same host > >> - broker, perf-test on different hosts (the results are practically the > >> same, so wont post them here) > >> > >> > >> I'm using FIO(http://freecode.com/projects/fio) to benchmark speed of > hard > >> drives. > >> > >> Hardware I'm using: > >> 1) m1.xlarge with ephemeral storage, 4 core cpu, 16 GB ram > >> 2) hi1.4xlarge with SSD, 16 core cpu, 64 GB ram > >> 3) desktop machine with 7200 rpm sata, 4 core cpu, 8 GB ram > >> > >> Kafka broker config: > >> Oracle jdk 1.6.0_38, -Xmx2048 > >> > >> socket.send.buffer=16777216 > >> socket.receive.buffer=16777216 > >> max.socket.request.bytes=104857600 > >> log.flush.interval=10000 > >> log.default.flush.interval.ms=1000 > >> log.default.flush.scheduler.interval.ms=1000 > >> num.threads=[num of cores] > >> > >> > >> For kafka-producer-perf-test I'm assuming that IO access pattern is > >> sequential write. > >> > >> Here is the test I ran with FIO: > >> > >> [sequential-write] > >> rw=write > >> size=50G > >> ioengine=sync > >> numjobs=1 > >> directory=/tmp/fio > >> filename=redo01.log > >> > >> > >> Here is kafka performance test: > >> > >> ./bin/kafka-producer-perf-test.sh -topic "perf" --batch-size 3000 > >> --messages 50000000 --message-size 1300 --brokerinfo > >> broker.list=0:host:9092 --threads [number-of-cores] > >> > >> > >> > ---------------------------------------------------------------------------------------- > >> | | m1.xlarge | hi1.4xlarge | desktop > >> | > >> > >> > > ---------------------------------------------------------------------------------------- > >> | kafka | 41 MB/s | 217 MB/s | 42 MB/s > | > >> > >> > > ----------------------------------------------------------------------------------------- > >> | fio | 106 MB/s | 377 MB/s | 74 MB/s > | > >> > >> > ---------------------------------------------------------------------------------------- > >> > >> > >> Question 1: The proportion (~1/2) is pretty stable against different > kind > >> of hardware I've tried. Is it as expected? Can something be done to > improve > >> this? > >> > >> I've tried to play with: > >> log.flush.interval=10000 > >> log.default.flush.interval.ms=1000 > >> log.default.flush.scheduler.interval.ms=1000 > >> > >> Like increasing 10 times, or decreasing 10 times, but haven't seen much > of > >> a difference in IO throughput > >> > >> The other thing that bugs me much more is that kafka consumer speed on > cold > >> IO cache is like 5-50 times slower from what I can get with "sequential > >> read" fio test. > >> > >> For kafka-consumer-perf-test I'm assuming that IO access pattern is > >> sequential read. > >> > >> Here is FIO test: > >> > >> [sequential-read] > >> rw=read > >> size=50G > >> ioengine=sync # I know that kafka use sendfile, but sync should be > >> slower, right? > >> numjobs=1 > >> directory=/tmp/fio > >> filename=redo01.log > >> > >> Here what I'm doing with kafka-consumer-perf-test: > >> > >> kafka-consumer-perf-test.sh -topic "perf" --messages 50000000 > --zookeeper > >> host:2181 --threads 1 --socket-buffer-size 16777216 --fetch-size > 16777216 > >> > >> The broker config is the same. > >> > >> I'm dropping IO cache before running tests: echo 3 > > >> /proc/sys/vm/drop_caches > >> > >> > >> > ----------------------------------------------------------------------------------------------- > >> | | m1.xlarge | hi1.4xlarge | > >> desktop | > >> > >> > > --------------------------------------------------------------------------------------------- > >> | kafka | 25 MB/s | 10 MB/s (???) | 20 > MB/s > >> | > >> > >> > > --------------------------------------------------------------------------------------------- > >> | fio | 130 MB/s | 450 MB/s | 67 > >> MB/s | > >> > >> > ---------------------------------------------------------------------------------------------- > >> > >> Question 2: Can something be done to improve consumer performance? > >> > >> Question 3 (most improtant for me): What might be the reasons for > consumer > >> to behave so badly on fastest hardware available? I see in iostat, that > >> consumer really does very little read requests to hard drive > >> > >> Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s > avgrq-sz > >> avgqu-sz await r_await w_await svctm %util > >> xvdb 0.00 0.00 144.00 0.00 6144.00 0.00 > 85.33 > >> 0.06 0.42 0.42 0.00 0.08 1.20 > >> > >> And cpus are idling > >> > >> avg-cpu: %user %nice %system %iowait %steal %idle > >> 2.16 0.00 0.09 0.06 0.03 97.66 > >> > >> > >> Besides that, even if the whole topic is in IO cache, the consumer > speed is > >> about 45 MB/s which is still quite below my expectations. > >> > >> And the picture doesn't change in different deployment configs (broker > and > >> test on same node or 2 different nodes) > >> > >> Any ideas why this might happen? > >> > >> Rafael Bagmanov, > >> Grid Dynamics. > >> >