Add UDP OS buffer size recommendations
parent
727b9f6d8b
commit
9625953d3e
|
@ -33,6 +33,8 @@
|
|||
- [#4676](https://github.com/influxdb/influxdb/pull/4676): UDP service listener performance enhancements
|
||||
- [#4659](https://github.com/influxdb/influxdb/pull/4659): Support IF EXISTS for DROP DATABASE. Thanks @ch33hau
|
||||
- [#4721](https://github.com/influxdb/influxdb/pull/4721): Export tsdb.InterfaceValues
|
||||
- [#4681](https://github.com/influxdb/influxdb/pull/4681): Increase default buffer size for collectd and graphite listeners
|
||||
- [#4659](https://github.com/influxdb/influxdb/pull/4659): Support IF EXISTS for DROP DATABASE
|
||||
|
||||
### Bugfixes
|
||||
- [#4715](https://github.com/influxdb/influxdb/pull/4715): Fix panic during Raft-close. Fix [issue #4707](https://github.com/influxdb/influxdb/issues/4707). Thanks @oiooj
|
||||
|
|
|
@ -212,6 +212,7 @@ reporting-disabled = false
|
|||
# batch-size = 1000 # will flush if this many points get buffered
|
||||
# batch-pending = 5 # number of batches that may be pending in memory
|
||||
# batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
|
||||
# udp-read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
|
||||
|
||||
## "name-schema" configures tag names for parsing the metric name from graphite protocol;
|
||||
## separated by `name-separator`.
|
||||
|
@ -252,6 +253,7 @@ reporting-disabled = false
|
|||
# batch-size = 1000 # will flush if this many points get buffered
|
||||
# batch-pending = 5 # number of batches that may be pending in memory
|
||||
# batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
|
||||
# read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
|
||||
|
||||
###
|
||||
### [opentsdb]
|
||||
|
@ -295,6 +297,7 @@ reporting-disabled = false
|
|||
# batch-size = 1000 # will flush if this many points get buffered
|
||||
# batch-pending = 5 # number of batches that may be pending in memory
|
||||
# batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
|
||||
# read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
|
||||
|
||||
###
|
||||
### [continuous_queries]
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
|
||||
The _collectd_ input allows InfluxDB to accept data transmitted in collectd native format. This data is transmitted over UDP.
|
||||
|
||||
## A note on UDP/IP OS Buffer sizes
|
||||
|
||||
If you're running Linux or FreeBSD, please adjust your OS UDP buffer
|
||||
size limit, [see here for more details.](../udp/README.md#a-note-on-udpip-os-buffer-sizes)
|
||||
|
||||
## Configuration
|
||||
|
||||
Each collectd input allows the binding address, target database, and target retention policy to be set. If the database does not exist, it will be created automatically when the input is initialized. If the retention policy is not configured, then the default retention policy for the database is used. However if the retention policy is set, the retention policy must be explicitly created. The input will not automatically create it.
|
||||
|
@ -25,6 +30,6 @@ Please note that UDP packages larger than the standard size of 1452 are dropped
|
|||
batch-size = 5000 # will flush if this many points get buffered
|
||||
batch-pending = 10 # number of batches that may be pending in memory
|
||||
batch-timeout = "10s"
|
||||
read-buffer = 8388608 # (8*1024*1024) UDP read buffer size
|
||||
read-buffer = 0 # UDP read buffer size, 0 means to use OS default
|
||||
typesdb = "/usr/share/collectd/types.db"
|
||||
```
|
||||
|
|
|
@ -27,10 +27,18 @@ const (
|
|||
|
||||
DefaultTypesDB = "/usr/share/collectd/types.db"
|
||||
|
||||
// DefaultUDPReadBuffer is the default UDP read buffer
|
||||
// DefaultReadBuffer is the default buffer size for the UDP listener.
|
||||
// Sets the size of the operating system's receive buffer associated with
|
||||
// the UDP traffic
|
||||
DefaultReadBuffer = 8 * 1024 * 1024
|
||||
// the UDP traffic. Keep in mind that the OS must be able
|
||||
// to handle the number set here or the UDP listener will error and exit.
|
||||
//
|
||||
// DefaultReadBuffer = 0 means to use the OS default, which is usually too
|
||||
// small for high UDP performance.
|
||||
//
|
||||
// Increasing OS buffer limits:
|
||||
// Linux: sudo sysctl -w net.core.rmem_max=<read-buffer>
|
||||
// BSD/Darwin: sudo sysctl -w kern.ipc.maxsockbuf=<read-buffer>
|
||||
DefaultReadBuffer = 0
|
||||
)
|
||||
|
||||
// Config represents a configuration for the collectd service.
|
||||
|
|
|
@ -122,7 +122,14 @@ func (s *Service) Open() error {
|
|||
if err != nil {
|
||||
return fmt.Errorf("unable to listen on UDP: %s", err)
|
||||
}
|
||||
conn.SetReadBuffer(s.Config.ReadBuffer)
|
||||
|
||||
if s.Config.ReadBuffer != 0 {
|
||||
err = conn.SetReadBuffer(s.Config.ReadBuffer)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to set UDP read buffer to %d: %s",
|
||||
s.Config.ReadBuffer, err)
|
||||
}
|
||||
}
|
||||
s.conn = conn
|
||||
|
||||
s.Logger.Println("Listening on UDP: ", conn.LocalAddr().String())
|
||||
|
|
|
@ -1,10 +1,17 @@
|
|||
# Configuration
|
||||
# The graphite Input
|
||||
|
||||
## A note on UDP/IP OS Buffer sizes
|
||||
|
||||
If you're using UDP input and running Linux or FreeBSD, please adjust your UDP buffer
|
||||
size limit, [see here for more details.](../udp/README.md#a-note-on-udpip-os-buffer-sizes)
|
||||
|
||||
## Configuration
|
||||
|
||||
Each Graphite input allows the binding address, target database, and protocol to be set. If the database does not exist, it will be created automatically when the input is initialized. The write-consistency-level can also be set. If any write operations do not meet the configured consistency guarantees, an error will occur and the data will not be indexed. The default consistency-level is `ONE`.
|
||||
|
||||
Each Graphite input also performs internal batching of the points it receives, as batched writes to the database are more efficient. The default _batch size_ is 1000, _pending batch_ factor is 5, with a _batch timeout_ of 1 second. This means the input will write batches of maximum size 1000, but if a batch has not reached 1000 points within 1 second of the first point being added to a batch, it will emit that batch regardless of size. The pending batch factor controls how many batches can be in memory at once, allowing the input to transmit a batch, while still building other batches.
|
||||
|
||||
# Parsing Metrics
|
||||
## Parsing Metrics
|
||||
|
||||
The graphite plugin allows measurements to be saved using the graphite line protocol. By default, enabling the graphite plugin will allow you to collect metrics and store them using the metric name as the measurement. If you send a metric named `servers.localhost.cpu.loadavg.10`, it will store the full metric name as the measurement with no extracted tags.
|
||||
|
||||
|
|
|
@ -35,10 +35,18 @@ const (
|
|||
// DefaultBatchTimeout is the default Graphite batch timeout.
|
||||
DefaultBatchTimeout = time.Second
|
||||
|
||||
// DefaultUDPReadBuffer is the default UDP read buffer
|
||||
// DefaultUDPReadBuffer is the default buffer size for the UDP listener.
|
||||
// Sets the size of the operating system's receive buffer associated with
|
||||
// the UDP traffic
|
||||
DefaultUDPReadBuffer = 8 * 1024 * 1024
|
||||
// the UDP traffic. Keep in mind that the OS must be able
|
||||
// to handle the number set here or the UDP listener will error and exit.
|
||||
//
|
||||
// DefaultReadBuffer = 0 means to use the OS default, which is usually too
|
||||
// small for high UDP performance.
|
||||
//
|
||||
// Increasing OS buffer limits:
|
||||
// Linux: sudo sysctl -w net.core.rmem_max=<read-buffer>
|
||||
// BSD/Darwin: sudo sysctl -w kern.ipc.maxsockbuf=<read-buffer>
|
||||
DefaultUDPReadBuffer = 0
|
||||
)
|
||||
|
||||
// Config represents the configuration for Graphite endpoints.
|
||||
|
|
|
@ -295,7 +295,14 @@ func (s *Service) openUDPServer() (net.Addr, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s.udpConn.SetReadBuffer(s.udpReadBuffer)
|
||||
|
||||
if s.udpReadBuffer != 0 {
|
||||
err = s.udpConn.SetReadBuffer(s.udpReadBuffer)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to set UDP read buffer to %d: %s",
|
||||
s.udpReadBuffer, err)
|
||||
}
|
||||
}
|
||||
|
||||
buf := make([]byte, udpBufferSize)
|
||||
s.wg.Add(1)
|
||||
|
|
|
@ -1,5 +1,68 @@
|
|||
# The UDP Input
|
||||
|
||||
## A note on UDP/IP OS Buffer sizes
|
||||
|
||||
Some OSes (most notably, Linux) place very restricive limits on the performance
|
||||
of UDP protocols. It is _highly_ recommended that you increase these OS limits to
|
||||
at least 8MB before trying to run large amounts of UDP traffic to your instance.
|
||||
8MB is just a recommendation, and should be adjusted to be inline with your
|
||||
`read-buffer` plugin setting.
|
||||
|
||||
### Linux
|
||||
Check the current UDP/IP receive buffer limit by typing the following commands:
|
||||
|
||||
```
|
||||
sysctl net.core.rmem_max
|
||||
```
|
||||
|
||||
If the values are less than 8388608 bytes you should add the following lines to the /etc/sysctl.conf file:
|
||||
|
||||
```
|
||||
net.core.rmem_max=8388608
|
||||
```
|
||||
|
||||
Changes to /etc/sysctl.conf do not take effect until reboot. To update the values immediately, type the following commands as root:
|
||||
|
||||
```
|
||||
sysctl -w net.core.rmem_max=8388608
|
||||
```
|
||||
|
||||
### BSD/Darwin
|
||||
|
||||
On BSD/Darwin systems you need to add about a 15% padding to the kernel limit
|
||||
socket buffer. Meaning if you want an 8MB buffer (8388608 bytes) you need to set
|
||||
the kernel limit to `8388608*1.15 = 9646900`. This is not documented anywhere but
|
||||
happens
|
||||
[in the kernel here.](https://github.com/freebsd/freebsd/blob/master/sys/kern/uipc_sockbuf.c#L63-L64)
|
||||
|
||||
Check the current UDP/IP buffer limit by typing the following command:
|
||||
|
||||
```
|
||||
sysctl kern.ipc.maxsockbuf
|
||||
```
|
||||
|
||||
If the value is less than 9646900 bytes you should add the following lines to the /etc/sysctl.conf file (create it if necessary):
|
||||
|
||||
```
|
||||
kern.ipc.maxsockbuf=9646900
|
||||
```
|
||||
|
||||
Changes to /etc/sysctl.conf do not take effect until reboot. To update the values immediately, type the following commands as root:
|
||||
|
||||
```
|
||||
sysctl -w kern.ipc.maxsockbuf=9646900
|
||||
```
|
||||
|
||||
### Using the read-buffer option for the UDP listener
|
||||
|
||||
The `read-buffer` option allows users to set the buffer size for the UDP listener.
|
||||
It Sets the size of the operating system's receive buffer associated with
|
||||
the UDP traffic. Keep in mind that the OS must be able
|
||||
to handle the number set here or the UDP listener will error and exit.
|
||||
|
||||
`read-buffer = 0` means to use the OS default, which is usually too
|
||||
small for high UDP performance.
|
||||
|
||||
## Configuration
|
||||
|
||||
Each UDP input allows the binding address, target database, and target retention policy to be set. If the database does not exist, it will be created automatically when the input is initialized. If the retention policy is not configured, then the default retention policy for the database is used. However if the retention policy is set, the retention policy must be explicitly created. The input will not automatically create it.
|
||||
|
@ -28,7 +91,7 @@ One UDP listener
|
|||
batch-size = 5000 # will flush if this many points get buffered
|
||||
batch-timeout = "1s" # will flush at least this often even if the batch-size is not reached
|
||||
batch-pending = 10 # number of batches that may be pending in memory
|
||||
read-buffer = 8388608 # (8*1024*1024) UDP read buffer size
|
||||
read-buffer = 0 # UDP read buffer, 0 means to use OS default
|
||||
...
|
||||
```
|
||||
|
||||
|
@ -45,7 +108,7 @@ Multiple UDP listeners
|
|||
batch-size = 5000 # will flush if this many points get buffered
|
||||
batch-timeout = "1s" # will flush at least this often even if the batch-size is not reached
|
||||
batch-pending = 10 # number of batches that may be pending in memory
|
||||
read-buffer = 8388608 # (8*1024*1024) UDP read buffer size
|
||||
read-buffer = 0 # UDP read buffer size, 0 means to use OS default
|
||||
|
||||
[[udp]]
|
||||
# High-traffic UDP
|
||||
|
@ -55,7 +118,7 @@ Multiple UDP listeners
|
|||
batch-size = 5000 # will flush if this many points get buffered
|
||||
batch-timeout = "1s" # will flush at least this often even if the batch-size is not reached
|
||||
batch-pending = 100 # number of batches that may be pending in memory
|
||||
read-buffer = 33554432 # (32*1024*1024) UDP read buffer size
|
||||
read-buffer = 8388608 # (8*1024*1024) UDP read buffer size
|
||||
...
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue