热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis优化之swap分区

swappiness参数说明swap对于操作系统来比较重要,当物理内存不足时,可以将一部分内存页进行swap操作,已解燃眉之急。但世界上没


 


swappiness 参数说明



swap对于操作系统来比较重要, 当物理内存不足时, 可以将一部分内存页进行swap操作, 已解燃眉之急。 但世界上没有免费午餐, swap空间由硬盘提供, 对于需要高并发、 高吞吐的应用来说, 磁盘IO通常会成为系统瓶颈。 在Linux中, 并不是要等到所有物理内存都使用完才会使用到swap, 系统参数swppiness会决定操作系统使用swap的倾向程度。 swappiness的取值范围是0~100, swappiness的值越大, 说明操作系统可能使用swap的概率越高, swappiness值越低, 表示操作系统更加倾向于使用物理内存。 swap的默认值是60, 了解这个值的含义后, 有利于Redis的性能优化。 如图swappiness的重要值进行了说明。

运维提示
OOM(Out Of Memory) killer机制是指Linux操作系统发现可用内存不足时, 强制杀死一些用户进程(非内核进程) , 来保证系统有足够的可用内存进行分配。

从表中可以看出, swappiness参数在Linux3.5版本前后的表现并不完全相同, Redis运维人员在设置这个值需要关注当前操作系统的内核版本。

需要根据服务器运行的程序类型,来设置不同的参数值。例如,对于Oracle一般设置为10;对于MySQL一般设置为1,尽可能不用swap分区。
 

 


设置方法



swappiness设置方法如下:

echo bestvalue > /proc/sys/vm/swappiness

但是上述方法在系统重启后就会失效, 为了让配置在重启Linux操作系统后立即生效, 只需要在/etc/sysctl.conf追加vm.swappiness={bestvalue}即可。

echo vm.swappiness=bestvalue >> /etc/sysctl.conf

[root@localhost ~]# cat /proc/sys/vm/swappiness
30修改vm.swappiness=1
[root@localhost ~]# echo vm.swappiness=1 >> /etc/sysctl.conf
[root@localhost ~]# cat /proc/sys/vm/swappiness
30然后加载参数
[root@localhost ~]# sysctl -p
vm.swappiness = 1
[root@localhost ~]# cat /proc/sys/vm/swappiness
1需要注意/proc/sys/vm/swappiness是设置操作, /etc/sysctl.conf是追加操作。

 


如何监控swap



(1) 查看swap的总体情况
Linux提供了free命令来查询操作系统的内存使用情况, 其中也包含了swap的相关使用情况。 下面是某台Linux服务器执行free–m(以兆为单位)的结果, 其中需要重点关注的是最后一行的swap统计, 从执行结果看,swap一共有4095MB, 使用了0MB, 空闲4095MB。

total used free shared buffers cached
Mem: 64385 31573 32812 0 505 10026
-/+ buffers/cache: 21040 43344
Swap: 4095 0 4095

在另一台Linux服务器同样执行free-m, 这台服务器开启了8189M swap,其中使用了5241MB。

total used free shared buffers cached
Mem: 24096 8237 15859 0 136 2483
-/+ buffers/cache: 5617 18479
Swap: 8189 5241 2947

(2) 实时查看swap的使用
Linux提供了vmstat命令查询系统的相关性能指标, 其中包含负载、CPU、 内存、 swap、 IO的相关属性。 但其中和swap有关的指标是si和so, 它们分别代表操作系统的swap in和swap out。 下面是执行vmstat1(每隔一秒输出) 的效果, 可以看到si和so都为0, 代表当前没有使用swap。

# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 33593468 517656 10271928 0 0 0 1 0 0 8 0 91 0 0
4 0 0 33594516 517656 10271928 0 0 0 0 10606 9647 10 1 90 0 0
1 0 0 33594392 517656 10271928 0 0 0 0 11490 10244 11 1 89 0 0
6 0 0 33594292 517656 10271928 0 0 0 36 12406 10681 13 1 87 0 0

(3) 查看指定进程的swap使用情况
Linux操作系统中, /proc/{pid}目录是存储指定进程的相关信息, 其中/proc/{pid}/smaps记录了当前进程所对应的内存映像信息, 这个信息对于查询指定进程的swap使用情况很有帮助。 下面以一个Redis实例进行说明。通过info server获取Redis的进程号process_id:

redis-cli -h ip -p port info server | grep process_id
process_id:986

通过cat/proc/986/smaps查询Redis的smaps信息, 由于有多个内存块信息, 这里只输出一个内存块镜像信息进行观察:

2aab0a400000-2aab35c00000 rw-p 2aab0a400000 00:00 0
Size: 712704 kB
Rss: 617872 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 15476 kB
Private_Dirty: 602396 kB
Swap: 58056 kB
Pss: 617872 kB

其中Swap字段代表该内存块存在swap分区的数据大小。 通过执行如下命令, 就可以找到每个内存块镜像信息中, 这个进程使用到的swap量, 通过求和就可以算出总的swap用量:

cat /proc/986/smaps | grep Swap
Swap: 0 kB
Swap: 0 kB…
Swap: 0 kB
Swap: 478320 kB…
Swap: 624 kB
Swap: 0 kB

如果Linux>3.5, vm.swapniess=1, 否则vm.swapniess=0, 从而实现如下两个目标:
·物理内存充足时候, 使Redis足够快。
·物理内存不足时候, 避免Redis死掉(如果当前Redis为高可用, 死掉比阻塞更好) 。

 


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
一个都不等
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有