sysctl
is a command-lin tool to modify kernel parameters at runtime in Linux.
ref:
http://man7.org/linux/man-pages/man8/sysctl.8.html
Usage
List All Parameters
$ sudo sysctl -a
$ sudo sysctl -a | grep tcp
The parameters available are those listed under /proc/sys/
.
$ cat /proc/sys/net/core/somaxconn
1024
Show the Entry of a Specified Parameter
$ sudo sysctl net.core.somaxconn
net.core.somaxconn = 1024
### Show the Value of a Specified Parameter
```console
$ sysctl -n net.core.somaxconn
1024
Change a Specified Parameter
# Elasticsearch
$ sysctl -w vm.max_map_count = 262143
# Redis
$ sysctl -w vm.overcommit_memory = 1
ref:
https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
https://redis.io/topics/admin
Persistence
`sysctl -w` only modify parameters at runtime, and they would be set to default values after the system is restarted. You must write those settings in `/etc/sysctl.conf` to persistent them.
# Do less swapping
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 2
# Prevents SYN DOS attacks. Applies to ipv6 as well, despite name.
net.ipv4.tcp_syncookies = 1
# Prevents ip spoofing.
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
# Only groups within this id range can use ping.
net.ipv4.ping_group_range=999 59999
# Redirects can potentially be used to maliciously alter hosts routing tables.
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 1
net.ipv6.conf.all.accept_redirects = 0
# The source routing feature includes some known vulnerabilities.
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# See RFC 1337
net.ipv4.tcp_rfc1337 = 1
# Enable IPv6 Privacy Extensions (see RFC4941 and RFC3041)
net.ipv6.conf.default.use_tempaddr = 2
net.ipv6.conf.all.use_tempaddr = 2
# Restarts computer after 120 seconds after kernel panic
kernel.panic = 120
# Users should not be able to create soft or hard links to files which they do not own. This mitigates several privilege escalation vulnerabilities.
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
ref:
https://blog.runcloud.io/how-to-secure-your-linux-server/
https://www.percona.com/blog/2019/02/25/mysql-challenge-100k-connections/
https://www.nginx.com/blog/tuning-nginx/
Activate parameters from the configuration file.
$ sudo sysctl -p
Troubleshooting
OS error code 24: Too many open files
$ sudo vim /etc/sysctl.conf
fs.file-max = 601017
$ sudo sysctl -p
$ sudo vim /etc/security/limits.d/nofile.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
$ ulimit -n 65535
OS error code 99: Cannot assign requested address
For MySQL. Because there's no available local network ports left. You might need to set `net.ipv4.tcp_tw_reuse = 1` instead of `net.ipv4.tcp_tw_recycle = 1`.
$ sudo vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
$ sudo sysctl -p
ref:
https://www.percona.com/blog/2014/12/08/what-happens-when-your-application-cannot-open-yet-another-connection-to-mysql/
https://stackoverflow.com/questions/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both
Parameters are missing from `sysctl -a` or `/proc/sys`
Sometimes you might find some parameters are not in `sysctl -a` or `/proc/sys`.
You can find them in `/sys`:
$ echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
$ echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
$ cat /sys/kernel/mm/transparent_hugepage/enabled
To persistent them:
$ vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
fi
$ systemctl enable rc-local
If /etc/rc.local
doesn't exist, create one and run chmod 644 /etc/rc.local
.
ref:
https://redis.io/topics/admin
https://unix.stackexchange.com/questions/99154/disable-transparent-hugepages