故障分析 | 执行sed命令卡死CPU消耗100%一例分析
作者:付祥
现居珠海,主要负责 Oracle、MySQL、mongoDB 和 Redis 维护工作。
本文来源:原创投稿
* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
现象
MySQL服务器安装MHA,sed命令修改安装脚本时卡死:
[root@TJ-DB-6CU552YPXS backup]# sed -i "s/.*vip.*ping valid.*/#&/g" mha_install.sh <br>^C<br>[root@TJ-DB-6CU552YPXS backup]#<br>
top查看,sed进程CPU使用率100%:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND <br>14343 root 20 0 104m 1020 852 R 100.0 0.0 0:13.94 sed<br>
分析
pstack打印进程堆栈信息:
[root@TJ-DB-6CU552YPXS ~]# pstack 14343<br>#0 0x00007f123d474e46 in gconv () from /usr/lib64/gconv/GBK.so<br>#1 0x0000003f8368c6ab in mbrtowc () from /lib64/libc.so.6<br>#2 0x00000000004052ed in ?? ()<br>#3 0x0000000000405373 in ?? ()<br>#4 0x0000000000406323 in ?? ()<br>#5 0x0000000000407875 in ?? ()<br>#6 0x00000000004026e4 in ?? ()<br>#7 0x0000003f8361f0bd in __libc_start_main () from /lib64/libc.so.6<br>#8 0x0000000000402029 in ?? ()<br>#9 0x00007ffcde547f38 in ?? ()<br>#10 0x000000000000001c in ?? ()<br>#11 0x0000000000000004 in ?? ()<br>#12 0x00007ffcde5498d0 in ?? ()<br>#13 0x00007ffcde5498d4 in ?? ()<br>#14 0x00007ffcde5498d7 in ?? ()<br>#15 0x00007ffcde5498da in ?? ()<br>#16 0x0000000000000000 in ?? ()<br>
sed卡在字符集转换gconv ()函数上,mha_install.sh文件字符集为uft-8,os当前session字符集为gbk:
[root@TJ-DB-6CU552YPXS backup]# file -i mha_install.sh <br>mha_install.sh: text/x-shellscript; charset=utf-8<br>[root@TJ-DB-6CU552YPXS backup]# locale<br>LANG=zh_CN.gbk<br>LC_CTYPE="zh_CN.gbk"<br>LC_NUMERIC="zh_CN.gbk"<br>LC_TIME="zh_CN.gbk"<br>LC_COLLATE="zh_CN.gbk"<br>LC_MONETARY="zh_CN.gbk"<br>LC_MESSAGES="zh_CN.gbk"<br>LC_PAPER="zh_CN.gbk"<br>LC_NAME="zh_CN.gbk"<br>LC_ADDRESS="zh_CN.gbk"<br>LC_TELEPHONE="zh_CN.gbk"<br>LC_MEASUREMENT="zh_CN.gbk"<br>LC_IDENTIFICATION="zh_CN.gbk"<br>LC_ALL=<br>[root@TJ-DB-6CU552YPXS backup]#<br>
即文件中某些内容通过sed命令从uft-8转gbk时卡死,设置环境变量LANG=en_US,不进行字符集转换,再次执行sed命令快速返回结果:
[root@TJ-DB-6CU552YPXS backup]# export LANG=en_US<br>[root@TJ-DB-6CU552YPXS backup]# sed -i "s/.*vip.*ping valid.*/#&/g" mha_install.sh <br>[root@TJ-DB-6CU552YPXS backup]#<br>
sed命令到底是读到哪一行内容出了问题?使用二分查找,很快便定位了问题所在行为325:
[root@TJ-DB-6CU552YPXS backup]# head -n 324 mha_install.sh|tail -1|sed -n '1p'<br><br>[root@TJ-DB-6CU552YPXS backup]# head -n 325 mha_install.sh|tail -1|sed -n '1p'<br>^C<br>[root@TJ-DB-6CU552YPXS backup]# head -n 325 mha_install.sh|tail -1<br> #生成密钥对<br>[root@TJ-DB-6CU552YPXS backup]#<br>
从输出不难猜测,应该是注释符号和中文之间没有空格,导致sed命令卡死,下面我们论证测试:
[root@TJ-DB-6CU552YPXS backup]# cat fxtest.txt <br># 生成密钥对<br>#生成密钥对[root@TJ-DB-6CU552YPXS backup]#<br><br>[root@TJ-DB-6CU552YPXS backup]# head -n 1 fxtest.txt |sed -n '1,$p'<br># 生成密钥对<br>[root@TJ-DB-6CU552YPXS backup]# head -n 2 fxtest.txt |sed -n '1,$p'<br># 生成密钥对<br>^C<br>[root@TJ-DB-6CU552YPXS backup]#<br>
这个安装脚本已经运行多次了,一直都没问题,为何在这台机器上出了问题?机器操作系统为centos 6,估计是sed版本低导致,查看sed版本:
[root@TJ-DB-6CU552YPXS backup]# sed --version<br>GNU sed 4.2.1<br>
找一台centos 7机器,查看sed版本:
[root@fxtest01 ~]# sed --version<br>sed (GNU sed) 4.2.2<br>
将 centos 7上sed拷贝到这台centos 6,再次执行同样操作,很快输出结果:
[root@TJ-DB-6CU552YPXS backup]# head -n 2 fxtest.txt |sed -n '1,$p'<br># 生成密钥对<br>^C<br>[root@TJ-DB-6CU552YPXS backup]#chmod +x sed && head -n 2 fxtest.txt |./sed -n '1,$p'<br># 生成密钥对<br>#生成密钥对[root@TJ-DB-6CU552YPXS backup]#<br>
总结
1、注释符号和汉字之间养成使用空格分隔习惯。
2、一些低版本工具在某些特殊情况下可能会触发bug,仔细分析及比对,总会找到问题根源。
本文关键字 :#sed# #cpu# #字符集#
<h5 data-tool="mdnice编辑器"></h5>
文章推荐:
技术分享 | MySQL Shell 定制化部署 MySQL 实例
新特性解读 | MySQL 8.0 对 GTID 的限制解除
技术分享 | MySQL InnoDB Cluster Set 介绍
技术分享 | MySQL 编写脚本时避免烦人的警告
关于SQLE
<p style='margin-top: 10px;letter-spacing: 0.544px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif'>爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。</p>
SQLE 获取
类型 | 地址 |
---|---|
版本库 | https://github.com/actiontech/sqle |
文档 | https://actiontech.github.io/sqle-docs-cn/ |
发布信息 | https://github.com/actiontech/sqle/releases |
数据审核插件开发文档 | https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html |
更多关于 SQLE 的信息和交流,请加入官方QQ交流群:637150065...
本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。