原文首发于博客园,作者:后青春期的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 是用来设置内存分配计谋的,有三种取值

寄义
0 内核检查是否有足够可用内存,有则通过。没有则申请失败,并返回错误给历程
1 示意内核允许超量使用内存直到用完为止
2 示意内核绝不过量的使用内存

日志中 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
说明
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

监控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 日志中建议禁用它。方式如下:

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开发与运维》 --- 付 磊 张益军

,

诚信在线

诚信在线(www.cx11zx.cn)现已开放诚信在线手机版下载。游戏公平、公开、公正,用实力赢取信誉。

声明:该文看法仅代表作者自己,与Sunbet 申博无关。转载请注明:潍坊风筝:Redis开发运维的陷阱及避坑指南
评论关闭

分享到:

【林克威专栏】电商一页式网站的用户快闪场景行销趋势整理