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

Redis运维优化的陷阱及避坑指南相关推荐

  1. Redis 开发陷阱及避坑指南!

    原文首发于博客园,作者:后青春期的Keats 地址:https://www.cnblogs.com/keatsCoder/ Linux 配置优化 我们在使用 Redis 过程中,可能更多的关注 Red ...

  2. java 连接redis_Redis 开发陷阱及避坑指南!

    Java技术栈 www.javastack.cn 关注优质文章 原文首发于博客园,作者:后青春期的Keats地址:https://www.cnblogs.com/keatsCoder/ Linux 配 ...

  3. 坑爹的Python陷阱(避坑指南)

    点击上方"视学算法",星标公众号 重磅干货,第一时间送达 作者:xybaby 来源:http://www.cnblogs.com/xybaby/ 我个人对陷阱的定义是这样的:代码看 ...

  4. redis 运维讲解01

    运维不需要往里面存数据,但是需要搭建.备份.扩容.收缩都是运维的工作,保证 redis 不能宕机.备份数据.协助开发查询数据 一.为什么需要redis 1.传统架构 ​app  →  DAL(DAL( ...

  5. CentOS 7 运维优化

    CentOS 7 运维优化 一般的,我们安装CentOS mini和其他相应服务后,就能正常工作了.但工作一段时间后,服务器会出现不稳定.被入侵.甚至在突然的高并发时直接瘫痪状况.这些问题大多都是由于 ...

  6. 优维科技招商基金 | 招商基金DevSecOps实践与避坑指南

    8月19日-20日,为期两天的2022GOPS全球运维大会完美落幕.优维科技作为大会的金牌合作伙伴,参与了此次大会,并在现场展会带来优维科技EasyOps®一体化运维平台的全新解决方案与最佳实践参考. ...

  7. Redis分片代理twemproxy快速搭建 | twemproxy Demo | twitter/ twemproxy 避坑指南 | autoconf-2.69下载

    前言 1.代理分类 面对高可用.高扩展.易维护,用一款redis代理都是上佳的选择. redis代理主要有:predixy.twemproxy.codis.redis-cerberus. 2.性能优劣 ...

  8. 项目从0到1避坑指南

    背景: 物流行业,老板信息化意识弱,不是现有的TMS而是一个新的方向,目前市场上竞品较少 前言: 一个项目从0到1,有相关的固定的考虑事项.然而,由于公司环境.项目涉及的行业等一些实际条件的约束,会在 ...

  9. Serverless 时代前端避坑指南

    作者 | 张挺 每个时代,从来不缺机会. 云原生的浪潮席卷而来,从 14 年到现在,上云的声音就没有停歇过,而如今到了 2020,云厂商都已经准备好了,而前端,是否也准备好踏入这纷争的领域,去拥抱时代 ...

最新文章

  1. Log4J配置方式Java工程测试
  2. 损失函数理解汇总,结合PyTorch1.7和TensorFlow2
  3. KubeEdge向左,K3S向右
  4. 2018.9.13,物理仿真实验作业1:测量结果的表示
  5. HDU 2068 Choose the best route
  6. [小创造]“XENON”,我的JSON变种。
  7. Oracle管理监控之如何对数据库进行监控检查
  8. python程序设计基础期末考试题,python程序设计基础答案章节期末答案
  9. libxml2交叉编译
  10. Java驼峰原则_Java:标识符规则_驼峰原则
  11. python如何提交作业_用python 实现录入学生作业情况的小程序
  12. mysql 约束 分类,MySQL约束类型及举例介绍
  13. [教程] KGFMapSystem - 快速创建游戏中的迷你地图
  14. IDEA多级包创建不分离解决方案
  15. 如何使用Pytest进行自动化测试
  16. STM32F103定时器解码PT2262
  17. python3 enumerate函数_python3 内置函数enumerate
  18. 网络渗透——CTF实践
  19. HNUST - 数据库课设
  20. Pywinauto基础03--控件操作

热门文章

  1. 植保口的面上项目共153项,系统总结
  2. cookie追加数据_集算器 SPL 抓取网页数据
  3. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加数值标签
  4. pandas基于dataframe特定数据列的指定阈值将原dataframe分割成两个dataframe(split dataframe based on column value threshold
  5. pandas移除dataframe字符串数据列中的前N个字符(remove the first n characters from values from column of dataframe)
  6. Python使用datetime中的timedelta模块实现时间增减:python计算100天后是哪年那月那日?
  7. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(输出多个分组、自定义颜色配置)实战
  8. ValueError: need at most 63 handles, got a sequence of length 65
  9. 使用聚类算法进行标签传播学习(Clustering for Semi-Supervised Learning)
  10. 时间序列、时间序列分析、时间序列效应分解、平稳时间序列、AIC和BIC