博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis zse如何取值_Redis 开发陷阱及避坑指南!
阅读量:6904 次
发布时间:2019-06-27

本文共 3965 字,大约阅读时间需要 13 分钟。

a4d6f59b357822c44248a6e2a9b38aef.png

Java技术栈

www.javastack.cn

关注阅读更多优质文章

原文首发于博客园,作者:后青春期的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
f69c7a3fb3aec7fd5b39e97e4077870f.png

最后一行即展示了 Swap 的使用情况,一共 2047 Mb,以使用 0 Mb,空闲 2047 Mb

实时查看 Swap 的使用

a62014628bb9274e9610533bb503892c.png

参数 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开发手册(嵩山版)》最新发布

2、打破你的认知!Java空指针居然还能这样玩

3、吊打 Tomcat ,Undertow 性能很炸!!

4、Spring Boot 太狠了,一次发布 3 个版本!

5、Spring Boot 如何快速集成 Redis?

6、盘点 6 个被淘汰的 Java 技术,曾经风光过!

7、Spring Boot Redis 实现分布式锁,真香!

8、国人开源了一款小而全的 Java 工具类库!

9、国人开源了一款超好用的 Redis 客户端!!

10、同事写了个隐藏 bug,我排查了 3 天!

扫码关注Java技术栈公众号阅读更多干货。

7d28f5265e7d69bd6f6213c805ed981b.png 点击「
」获取面试题大全~
你可能感兴趣的文章
Oozie coordinator 作业自定义的配置的一些方法
查看>>
Cacti监控MySQL实现过程中碰到的问题解汇总
查看>>
linux操作系统的分类及解释
查看>>
腾讯大讲堂ppt全集
查看>>
[LeetCode] Design Phone Directory 设计电话目录
查看>>
jquery 里面对数组去重操作-unique
查看>>
使用thrift实现了Javaserver和nodejsclient之间的跨平台通信
查看>>
HUE配置文件hue.ini 的hdfs_clusters模块详解(图文详解)(分HA集群和非HA集群)
查看>>
Delicious Apples (hdu 5303 贪心+枚举)
查看>>
POJ - 2236Wireless Network-并查集
查看>>
shiro 启动异常
查看>>
006-对象—— static关键字 静态属性和方法的使用
查看>>
【.Net+数据库】Unable to convert MySQL date/time value to System.DateTime
查看>>
LNMP添加、删除虚拟主机及伪静态使用教程
查看>>
Secure CRT 自动记录日志log配置
查看>>
130. Surrounded Regions
查看>>
Visual Studio 2015编译wxWidgets
查看>>
class文件魔数CAFEBABE的由来
查看>>
Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案...
查看>>
spring 定时任务@Scheduled
查看>>