原文首发于博客园,做者:后青春期的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开发与运维》 --- 付 磊 张益军