gaussdb 【FAQ_003】【事务并发量大_IO繁忙_导致Linux系统崩溃】

问题现象
在数据库事务并发量太大且IO操作密集的情况下,Linux系统(单板或者服务器)重启。查看Linux系统日志,有类似如下提示信息:

Nov  7 20:01:26 linux kernel: [473215.424811] INFO: task gaussdb:8723 blocked for more than 120 seconds.
Nov  7 20:01:26 linux kernel: [473215.424814] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Nov  7 20:01:26 linux kernel: [473215.424818] gaussdb       D 00000000ffffffff     0  8723   8712 0x00000000
Nov  7 20:01:26 linux kernel: [473215.424823]  ffff880c78593e90 0000000000000086 ffffffff810c84cb ffff880c6abde080
Nov  7 20:01:26 linux kernel: [473215.424830]  0000000000013700 ffff880c78593fd8 0000000000013700 ffff880c78593fd8
Nov  7 20:01:26 linux kernel: [473215.424836]  0000000000013700 0000000000013700 0000000000013700 0000000000013700
Nov  7 20:01:26 linux kernel: [473215.424842] Call Trace:
Nov  7 20:01:26 linux kernel: [473215.424859]  [<ffffffff8139a3ef>] __mutex_lock_slowpath+0x11f/0x1b0
Nov  7 20:01:26 linux kernel: [473215.424867]  [<ffffffff81399d9a>] mutex_lock+0x1a/0x40
Nov  7 20:01:26 linux kernel: [473215.424876]  [<ffffffff810fe1df>] generic_file_llseek+0x2f/0x70
Nov  7 20:01:26 linux kernel: [473215.424884]  [<ffffffff810fd13e>] sys_lseek+0x7e/0x90
Nov  7 20:01:26 linux kernel: [473215.424893]  [<ffffffff81002f7b>] system_call_fastpath+0x16/0x1b
Nov  7 20:01:26 linux kernel: [473215.424912]  [<00007f6a04d13880>] 0x7f6a04d13880

可能原因
Linux系统中默认设置40%的可用内存用来做系统缓存,在flush数据时,如果系统缓存IO同步问题导致超时,就会导致相关进程挂起,从而可能导致操作系统内核崩溃。

实际上在2.6.30之后的Linux版本中,在进程被挂起后,操作系统会默认等待kernel.hung_task_timeout_secs(默认120秒)时间,然后判断是否引发panic(即判断sysctl_hung_task_panic参数是否不为0),如果需要则会引发panic(内核崩溃),之后Linux系统就会自动重启

处理步骤

方法一:减小系统缓存的大小(例如从40%减小到10%,根据开源社区mysql、apache等系统发生此类问题的经验数据),增大操作系统对内存操作的频度,避免在占用大量内存的情况下处理flush超时。

修改内核配置文件“/etc/sysctl.conf”。
在此文件的任意位置增加如下参数。

vm.dirty_ratio=10

执行如下命令,使SUSE Linux 启动时自动读取内核参数。

/sbin/chkconfig boot.sysctl on

执行如下命令使内核参数生效。

/sbin/sysctl -p

方法二:调整Linux进程挂起的时间。

注意
调整Linux进程挂起时间要求Linux 内核版本必须是kernel-2.6.18-238以上。如果内核版本为2.6.18-194.32.1.el5,则需要先升级内核版本。

例如:将kernel.hung_task_timeout_secs参数修改为300,即5分钟或更长(具体时长需要业务根据自己的性能指标来确定)。

修改内核配置文件"/etc/sysctl.conf"。
在此文件的任意位置增加如下参数。

kernel.hung_task_timeout_secs=300

执行如下命令,使SUSE Linux启动时自动读取内核参数。

/sbin/chkconfig boot.sysctl on

执行如下命令使内核参数生效。

/sbin/sysctl -p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值