Performance tuning¶
This section contains some suggested values to get a better performance from Charmed Apache Kafka.
Virtual memory handling (recommended)¶
Apache Kafka brokers make heavy use of the OS page cache to maintain performance. They never
normally explicitly issue a command to ensure messages have been persisted to disk (sync), relying
instead on the underlying OS to ensure that larger chunks (pages) of data are persisted from the
page cache to the disk when the OS deems it efficient and/or necessary to do so. As such, there is a
range of runtime kernel parameter tuning that is recommended to be set on machines running Apache
Kafka to improve performance.
To configure these settings, one can write them to /etc/sysctl.conf using
sudo echo $SETTING >> /etc/sysctl.conf. Note that the settings shown below are simply sensible
defaults that may not apply to every workload:
# ensures a low likelihood of memory being assigned to swap space rather than drop pages from the page cache
vm.swappiness=1
# higher ratio results in less frequent disk flushes and better disk I/O performance
vm.dirty_ratio=80
vm.dirty_background_ratio=5
Memory maps (recommended)¶
Each Apache Kafka log segment requires an index file and a timeindex file, both requiring one
map area. The default OS maximum number of memory map areas a process can have is set by
vm.max_map_count=65536. For production deployments with a large number of partitions and
log-segments, it is likely to exceed the maximum OS limit.
It is recommended to set the mmap number sufficiently higher than the number of memory mapped files.
This can also be written to /etc/sysctl.conf:
vm.max_map_count=<new_mmap_value>
File descriptors (recommended)¶
Apache Kafka uses file descriptors for log segments and open connections. If a broker hosts many
partitions, keep in mind that the broker requires at least
(number_of_partitions)*(partition_size/segment_size) file descriptors to track all the log
segments and number of connections.
To configure those limits, update the values and add the following to
/etc/security/limits.d/root.conf:
#<domain> <type> <item> <value>
root soft nofile 262144
root hard nofile 1024288
Networking (optional)¶
If you are expecting a large amount of network traffic, kernel parameter tuning may help meet that
expected demand. These can also be written to /etc/sysctl.conf:
# default send socket buffer size
net.core.wmem_default=
# default receive socket buffer size
net.core.rmem_default=
# maximum send socket buffer size
net.core.wmem_max=
# maximum receive socket buffer size
net.core.rmem_max=
# memory reserved for TCP send buffers
net.ipv4.tcp_wmem=
# memory reserved for TCP receive buffers
net.ipv4.tcp_rmem=
# TCP Window Scaling option
net.ipv4.tcp_window_scaling=
# maximum number of outstanding TCP connection requests
net.ipv4.tcp_max_syn_backlog=
# maximum number of queued packets on the kernel input side (useful to deal with spike of network requests).
net.core.netdev_max_backlog=