原文首發於博客園,做者:後青春期的Keats;地址:https://www.cnblogs.com/keatsCoder/ 轉載請註明,謝謝!linux
咱們在使用 Redis 過程當中,可能更多的關注 Redis 自己的一些配置優化,如 AOF、RDB 配置、數據結構配置優化等。可是不多關心 Redis 的載體,服務器的優化。而這每每爲咱們的項目運行帶來災難性的打擊。所以服務器優化也是必不可少的redis
Redis啓動時,可能會出現下面的日誌shell
# 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 是用來設置內存分配策略的,有三種取值網絡
值 | 含義 |
---|---|
0 | 內核檢查是否有足夠可用內存,有則經過。沒有則申請失敗,並返回錯誤給進程 |
1 | 表示內核容許超量使用內存直到用完爲止 |
2 | 表示內核毫不過量的使用內存 |
日誌中 Background save 指的是 bgsave 和 bgrewriteaof 。根據操做系統的配置,若是 overcommit_memory 設置爲 0 則可能會形成內存申請失敗而致使後臺持久化失敗。所以 Redis 建議將這個值設置爲 1 是爲了 fork 操做在低內存下也能執行成功。數據結構
經過命令修改,當即生效。重啓後會失效併發
sysctl vm.overcommit_memory=1
再將改動寫入系統配置文件,使其永久有效app
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
採用 Redis 建議的配置是爲了在極端狀況下 Linux 能夠擠出來一些內存供 Redis 備份,可是更建議優先配置好 maxmemory ,給機器留 20%~30% 的空閒內存運維
swap 是指當物理內存不足時,拿出部分硬盤空間當 SWAP 分區(虛擬成內存)使用。咱們都知道硬盤的讀寫速度相對於內存實在是太雞肋,對於高併發、高吞吐的應用來講,磁盤IO通長會成爲系統瓶頸。Linux 系統中 swappiness 的值控制操做系統使用 swap 的傾向程度。tcp
查看內核版本:
uname -sr
值 | 說明 |
---|---|
0 | 內核版本 3.5 及以上 寧願使用 OOM Killer 也不使用 SWAP;內核版本 3.4 及更早則反之 |
1 | 內核版本 3.5 及以上 寧願使用 OOM Killer 也不使用 SWAP |
60 | 默認值 |
主動使用 SWAP |
PS:OOM Killer 是指當 Linux 發現操做系統內存不足時,主動殺死一些非內核進程的操做
echo {value} > /proc/sys/vm/swappiness
echo vm.swappiness={value} >> etc/sysctl.conf
free -m
最後一行即展現了 Swap 的使用狀況,一共 2047 Mb,以使用 0 Mb,空閒 2047 Mb
參數 si 表示 swap in ,so 表示 swap out 在個人機器上都是 0 表示沒有使用交換
經過 ps -ef |grep redis 查看 Redis 進程號,例如 1621
經過 cat /proc/1621/smaps | grep Swap 命令查看每一個內存塊 Redis Swap 的使用狀況
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 日誌中建議禁用它。方法以下:
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 不報警然而實際是沒有做用的,須要注意。應該改動對應位置的值
在集羣或哨兵環境中,多臺服務器使用相同的網絡時間協議同步時間能更方便的閱讀日誌,排查問題
能夠設置定時任務同步時間
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 握手時候的隊列大小。若是該值太小。會致使高併發場景下部分鏈接第三次握手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開發與運維》 --- 付 磊 張益軍