面试题答案
一键面试内核参数选择依据
vm.swappiness
:- 依据:该参数控制内核将内存数据交换到磁盘交换空间(swap)的倾向程度,取值范围是0 - 100。对于Redis RDB文件创建,若值过高,可能导致在RDB创建过程中,Redis进程使用的内存被频繁交换到磁盘,增加磁盘I/O负担且降低RDB创建效率。所以建议设置为较低值,如10,以减少不必要的内存与磁盘交换,保证Redis进程有足够内存用于RDB创建。
vm.dirty_ratio
和vm.dirty_background_ratio
:- 依据:
vm.dirty_ratio
表示当脏页(已修改但未写入磁盘的内存页)占系统内存的百分比达到此值时,系统将开始同步脏页到磁盘;vm.dirty_background_ratio
表示当脏页占系统内存百分比达到此值时,内核会启动pdflush或kdmflush等后台进程将脏页写入磁盘。在Redis RDB创建时,可能会产生大量脏页。适当提高vm.dirty_background_ratio
(如15),可以让后台进程更早地开始处理脏页,而适当降低vm.dirty_ratio
(如20),可以使系统在脏页积累过多前就进行同步,避免RDB创建后期大量脏页集中写入磁盘造成I/O压力过大。
- 依据:
nofile
(属于ulimit
限制参数):- 依据:Redis在创建RDB文件时需要打开文件进行写入操作。如果系统允许的最大打开文件数(
nofile
)过小,可能导致RDB创建失败或性能受限。应根据系统内存、Redis数据量等因素适当调高该值,如将其设置为65535,确保Redis在创建RDB文件时不会因文件打开数限制而受阻。
- 依据:Redis在创建RDB文件时需要打开文件进行写入操作。如果系统允许的最大打开文件数(
策略设计逻辑
- 系统负载监控:
- 定期(如每隔10秒)采集系统负载信息,包括CPU使用率、内存使用率、磁盘I/O使用率等。可以使用
top
、iostat
等工具获取相关数据。例如,通过top
命令获取CPU和内存使用率,通过iostat
获取磁盘I/O使用率。
- 定期(如每隔10秒)采集系统负载信息,包括CPU使用率、内存使用率、磁盘I/O使用率等。可以使用
- 负载等级划分:
- 根据系统负载情况划分不同等级,如低负载、中负载、高负载。例如,设定CPU使用率低于30%、内存使用率低于60%、磁盘I/O使用率低于50%为低负载;CPU使用率在30% - 70%、内存使用率在60% - 80%、磁盘I/O使用率在50% - 80%为中负载;CPU使用率高于70%、内存使用率高于80%、磁盘I/O使用率高于80%为高负载。
- 策略调整:
- 低负载:可适当放宽对
vm.dirty_ratio
的限制,如提高到25,让脏页积累更多后再同步,减少同步次数以提高I/O效率;同时可适当降低vm.swappiness
,如设为5,进一步减少内存交换。 - 中负载:保持默认优化参数,即
vm.swappiness = 10
,vm.dirty_ratio = 20
,vm.dirty_background_ratio = 15
,维持系统平衡。 - 高负载:降低
vm.dirty_ratio
到15,加快脏页同步,避免大量脏页集中写入磁盘;同时提高vm.dirty_background_ratio
到20,让后台进程更积极地处理脏页。对于nofile
,若发现RDB创建过程中有文件打开失败的情况,适当提高该值。
- 低负载:可适当放宽对
实现该策略的技术要点
- 监控脚本编写:
- 使用Shell脚本或Python脚本实现系统负载监控。例如,用Python结合
psutil
库获取CPU、内存使用率,结合pysysinfo
库获取磁盘I/O使用率。示例代码如下(Python):
- 使用Shell脚本或Python脚本实现系统负载监控。例如,用Python结合
import psutil
import pysysinfo.diskio as diskio
def get_system_load():
cpu_percent = psutil.cpu_percent(interval = 1)
mem_percent = psutil.virtual_memory().percent
disk_io = diskio.get_diskio()
disk_percent = disk_io['total']['util']
return cpu_percent, mem_percent, disk_percent
- 内核参数调整:
- 在Linux系统中,通过修改
/etc/sysctl.conf
文件来调整vm.swappiness
、vm.dirty_ratio
和vm.dirty_background_ratio
等参数,修改后执行sysctl -p
使配置生效。例如,修改vm.swappiness
:
- 在Linux系统中,通过修改
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
对于 nofile
参数,可通过修改 /etc/security/limits.conf
文件来调整,添加或修改如下行:
* soft nofile 65535
* hard nofile 65535
- 自动化调度:
- 使用
cron
或系统d定时器来定期执行监控脚本,实现自动化的策略调整。例如,使用cron
,编辑crontab -e
,添加如下行,每隔10秒执行一次监控脚本:
- 使用
*/10 * * * * /path/to/monitor_script.sh
在监控脚本中根据负载情况调用相应的内核参数调整命令,实现自适应的策略调整。