caseStudy-20180913-Kafka进程挂掉&解决办法

问题描述

2018年xx月xx日 下午4点20分左右 xxx无意中看到xxx正在排查线上Kafka集群遇到的问题,随后问明情况,有一台机器上Kafka进程挂了,当时他正在lark平台上查看错误日志信息,随后我一起加入排查问题。
事故起止时间:2018年xx月xx日 16时30分~2018年9月13日 17时25分
业务影响:理论上无影响,业务自动容错,生产和消费读写失败重试路由到其他Kafka节点上。
参与处理人:xxx、xxx

处理过程

2018年xx月xx日 16时42分 xxx查看lark日志,分析错误日志
2018年xx月xx日 16时48分 xxx登录Kafka机器10.136.40.2 查看系统参数
2018年xx月xx日 16时55分 xxx整理系统优化参数列表
2018年xx月xx日 17时12分  xxx修改系统参数
2018年xx月xx日 17时25分 xxx通过开源cloudera平台重启Kafka服务,观察日志,启动正常

定位过程

1.查看lark错误日志

看到 more Caused by: java.lang.OutOfMemoryError: Map failed at sun.nio.ch.FileChannelImpl.map0(Native Method) 错误

登录上机器(ssh 10.136.40.2)查看:

如上图不是jvm heap OutofMemoryError报错,是新创建索引文件做mmap内存映射时报错,通过判断分析,很可能是max_map_count数量不足导致的。
google搜索问题原因:https://stackoverflow.com/questions/43042144/kafka-server-failed-to-start-java-io-ioexception-map-failed

基本确定是max_map_count配置过低导致的
查看系统参数配置
[[email protected] kafka]$ sudo sysctl -a | grep "max_map_count"
vm.max_map_count = 65530

通过Kafka系统参数配置,想到了elastic search启动前强制配置系统参数,否则启动报错

es中vm.max_map_count参数配置

es启动强制优化的做法,值得借鉴

为什么会出现此次故障

  • 1.缺乏完善监控报警系统,无法做到及时预警
  • 2.我们对Kafka集群线上运行情况不掌握,不了解
  • 3.centos系统未做参数优化

为什么缺乏监控报警系统

  • 因为我们的Kafka生态圈处于建设中

为什么Kafka集群线上运行情况不掌握,不了解

  • 因为之前对Kafka了解甚少,缺乏对Kafka整体把控和认识

为什么系统未做参数优化

  • 因为系统是运维安装的,我们就直接用了,没有注意到会有如此影响,对Kafka运行环境要求理解不深刻

max_map_count作用分析

名词解释:进程中虚拟内存映射区域的最大数量。
官方解释:https://www.oschina.net/translate/understanding-virtual-memory?print
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
百度质量部分析参考:http://www.10tiao.com/html/473/201606/2651473114/1.html

程序底层调研malloc、直接调用mmap和mprotect和加载共享库时、java中类FileChannel.map方法都会产生内存映射区域。

Kafka服务使用scala语言开发,运行与jvm平台上,因为jvm heap是预分配的内存,所以占用虚拟虚拟内存区域很少。在Kafka程序中占用最大是做文件映射(调用mmap函数),Kafka中存储分为数据文件和索引文件,数据文件直接读写不进行mmap映射,而索引文件为了加快读写速度就实现了mmap映射机制,每创建一个索引文件做一次虚拟内存映射,map_count数量就加1,直到当前map_count > 系统 max_map_count,就会抛出OutofMemoryError,接着java进程退出了。下面是索引文件做映射的代码

后续工作

Kafka集群面临的风险
如果其他节点不进行系统参数优化,Kafka节点可能因为请求高峰或数据倾斜,也有挡掉的风险,所以Kafka集群所有的节点都要进行调整,防患于未然。下面TODO工作。

梳理系统参数列表 列出所有系统优化参数  xxx    xx月xx日 DONE
编写脚本上线执行 提交工单,运维负责执行 xxx  xx月xx日 DONE

博客地址引用:https://www.cnblogs.com/lizherui/p/12650254.html

原文地址:https://www.cnblogs.com/lizherui/p/12650254.html

时间: 2024-10-14 15:52:02

caseStudy-20180913-Kafka进程挂掉&解决办法的相关文章

linux网卡掉包或挂掉解决办法

最近自己公司网站老出现掉包问题之前以为是网络问题或机房问题,经过N久的排查发现是linux网卡掉包了,下面我来分享我的解决办法. 之前公司的系统由于网卡问题,经常出现掉包(掉包排除攻击的 因素)或者突然挂掉, 严重影响服务的正常提供,因此想在出现此问题时自动解决. 思路:对网卡检测掉包情况,或者用ping检测,出现了,就重启哈网卡 .瞧是很简单吧! 代码如下:  代码如下 复制代码 #安装帮助: mkdir  /cyc #/cyc/renetwork.log为日志文件 #!/bin/bash #

字段更改造成ogg进程停止解决办法

收到开发人员的变更邮件申请,需要在某个表增加字段,由于我们的环境DDL是没有开启的.用的消息中间件Kafka做传输消费,应用到目标库.由于紧急变更,先做字段变更吧. 变更完成后,查看ogg状态:[[email protected] ggs12]$ ./ggsci Oracle GoldenGate Command Interpreter for OracleVersion 12.1.2.1.0 OGGCORE_12.1.2.1.0_PLATFORMS_140727.2135.1_FBOLinux

由于crondtab定时任务导致大量sendmail进程的解决办法

早上六点多钟有一台服务器告警说宕机了,尝试登陆发现登陆服务器没问题,ps -ef | grep mysql的时候发现mysqld服务也还在,mysql错误日志也没有任务报错.但是查看vim /var/log/messages时发现是硬盘有问题,尝试touch一个文件的时候提示'read-only file system',于是联系机房检测故障. 但是当执行top的时候发现当前用户下面有很多sendmail的进程,如下图所示,发件人是crondaemon,怀疑是和定时任务有关,查看当前用户的定时任

Mysql经常出现sleep进程的解决办法

公司有一台linux服务器专门用来跑公司的WEB服务,由于历史原因,站点数与页面非常多,导致经常出现大量的sleep进程:MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存.如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connecti

由于您和其他用户试图同时改变同一数据,导致 Microsoft Jet 数据库引擎停止进程解决办法

重装系统,发现程序出错,提示: 由于您和其他用户试图同时改变同一数据,导致 Microsoft Jet 数据库引擎停止进程. 解决办法:直接打开ACC数据库,修复数据库,即可成功!

linux下监视进程挂掉后自动重启的shell脚本

本文介绍的这个shell脚本,通过一个while-do循环,用ps -ef|grep 检查loader进程是否正在运行,如果没有运行,则启动,确保崩溃挂掉的进程,及时自动重启. 脚本内容如下: #!/bin/sh while : do echo "Current DIR is " $PWD stillRunning=$(ps -ef |grep "$PWD/loader" |grep -v "grep") if [ "$stillRun

Hadoop集群datanode死掉或者secondarynamenode进程消失处理办法

当Hadoop集群的某单个节点出现问题时,一般不必重启整个系统,只须重启这个节点,它会自动连入整个集群. 在坏死的节点上输入如下命令即可: hadoop-daemon.sh start datanode hadoop-daemon.sh start secondarynamenode 案例如下: hadoop节点死机,能ping通,ssh连接不上 案例: 时间:2014/9/11 上午 表现:hadoop的web界面上TC-hadoop018节点dead 症状:节点TC-hadoop018的ss

全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)

不多说,直接上干货! 问题详情 情况描述如题所示,hbase启动以后,HMaster进程启动了,几秒钟以后自动关闭,但是HRegionServer进程正常运行: 解决办法: 1.检查下每台机器的时间是否同步: 2.检查下每台机器的防火墙是否关闭: 3.查看HMaster的日志路径 但是不久后HMaster会自动关闭,hbase启动失败啊!!! 查看日志 我们这样解决,我们进入zookeeper里面,删除hbase的数据 再次启动hbase HMaster不会挂掉.即成功解决. 欢迎大家,加入我的

无法启动MYSQL服务”1067 进程意外终止”解决办法——汇总及终极方法

自己一开始按照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,但是到后面步骤总是出现1067代号的错误.慢慢折腾去解决. 这里汇总各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止"的一些解决办法.自己遇到这个问题是查了很多方法不行,最后看到一个论坛的讨论,试了一下竟然可以.一下是网上的部分方法,最后可以的那个方法我放在最后面: 启用MySql服务的时候出现"windows无法启动mysql服务(位于本地计算