原文首發於博客園,作者:后青春期的Keats
地址:https://www.cnblogs.com/keatsCoder/
Linux 配置優化
我們在使用 Redis 過程中,可能更多的關注 Redis 本身的一些配置優化,如 AOF、RDB 配置、數據結構配置優化等。
但是很少關心 Redis 的載體,服務器的優化。而這往往為我們的項目運行帶來災難性的打擊。因此服務器優化也是必不可少的。
內存分配控制
Redis 啟動時,可能會出現下面的日志
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit\_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
overcommit 是 Linux 的一種內存處理機制:Linux 對絕大多數內存申請都會回復 yes,以便運行更多的程序。因為申請內存后,並不會馬上使用內存。這種機制就是 overcommit 。
而 overcommit_memory 是用來設置內存分配策略的,有三種取值
日志中 Background save 指的是 bgsave 和 bgrewriteaof 。根據操作系統的配置,如果 overcommit_memory 設置為 0 則可能會造成內存申請失敗而導致后台持久化失敗。
因此 Redis 建議將這個值設置為 1 是為了 fork 操作在低內存下也能執行成功。
設置方法
通過命令修改,立即生效。重啟后會失效
sysctl vm.overcommit_memory=1
再將改動寫入系統配置文件,使其永久有效
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
建議
采用 Redis 建議的配置是為了在極端情況下 Linux 可以擠出來一些內存供 Redis 備份,但是更建議優先配置好 maxmemory ,給機器留 20%~30% 的空閑內存。
硬盤虛擬內存
swap 是指當物理內存不足時,拿出部分硬盤空間當 SWAP 分區(虛擬成內存)使用。我們都知道硬盤的讀寫速度相對於內存實在是太雞肋,對於高並發、高吞吐的應用來說,磁盤IO通長會成為系統瓶頸。Linux 系統中 swappiness 的值控制操作系統使用 swap 的傾向程度。
查看內核版本:
uname -sr
主動使用 SWAP
PS:OOM Killer 是指當 Linux 發現操作系統內存不足時,主動殺死一些非內核進程的操作
設置方法
echo {value} > /proc/sys/vm/swappiness
echo vm.swappiness={value} >> etc/sysctl.conf
監控swap
查看 Swap 的總體情況
free -m
最后一行即展示了 Swap 的使用情況,一共 2047 Mb,以使用 0 Mb,空閑 2047 Mb
實時查看 Swap 的使用
參數 si 表示 swap in ,so 表示 swap out 在我的機器上都是 0 表示沒有使用交換
查看指定進程的 Swap 情況
通過 ps -ef |grep redis 查看 Redis 進程號,例如 1621
通過 cat /proc/1621/smaps | grep Swap 命令查看每個內存塊 Redis Swap 的使用情況
THP 內存頁大小
Redis 啟動時可能會看到下面的日志
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
提示告訴我們建議修改 Transparent Huge Pages (THP) 的配置,Linux kernel 在 2.6.38 內核增加了 THP 特性,支持大內存頁(2MB)分配,默認開啟。
開啟后可加快 fork 子進程的速度,但是 fork 操作后,每個內存頁從原來的 4KB 變為 2MB,會大幅加重重寫期間父進程內存消耗。
同時每次寫命令引起的復制內存頁單位放大了512倍。會拖慢寫操作的執行時間。造成大量的寫操作慢查詢因此 Redis日志中建議禁用它。另外關注Java技術棧公眾號在后台回復面試可以獲取一份面試題大全。
方法如下:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
另外在 /etc/rc.local 中追加
echo never > /sys/kernel/mm/transparent_hugepage/enabled
對於某些發行版本(例如紅帽6以上)配置文件不在這個位置(在 /sys/kernel/mm/redhat_transparent_hugepage/enabled),但是 Redis 檢查 THP 是寫死的此位置,所以雖然這么修改后 Redis不報警然而實際是沒有作用的,需要注意。應該改動對應位置的值
使用NTP 同步時間
在集群或哨兵環境中,多台服務器使用相同的網絡時間協議同步時間能更方便的閱讀日志,排查問題
可以設置定時任務同步時間
crontab -u //設定某個用戶的cron服務
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除某個用戶的cron服務
crontab -e //編輯某個用戶的cron服務
crontab -i //打印提示,輸入yes等確認信息
添加每小時執行一次的任務
0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org > dev/null 2>&1
最大連接數限制
通過 ulimit -a 命令查看和設置當前用戶進程的資源數,其中包含 open files 參數,是單個用戶同時打開的最大文件描述符個數。雖然 Redis 中可以配置最大的客戶端連接數(默認 10000) 。
Redis 內部最多使用 32 個文件描述符。當 open files = 4096 時,Redis 最大提供 4096-32=4064 個連接。因為它不能突破操作系統的限制。如果需要,使用如下命令修改:
ulimit -Sn {max-open-files}
TCP backlog
tcp backlog 配置的是 tcp 握手時候的隊列大小。如果該值過小。會導致高並發場景下部分連接第三次握手ACK被丟棄。關於 backlog
The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
Redis啟動時,會告訴我們系統配置中該值是 128,而 Redis 511。這個 511 是沒用的,因為系統比這個小。需要修改系統 backlog 的值。
echo 511 > /proc/sys/net/core/somaxconn
參考文獻:
《Redis開發與運維》 --- 付 磊 張益軍
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,刷新你的認知!!
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。
覺得不錯,別忘了隨手點贊+轉發哦!