Kafka其实也只是一个JVM进程,要想把一个进程搞崩溃,相信大家的nice idea(骚操作)也不少。本文中只是用了一种很常见的方式来使得Kafka的进程崩溃,通过分析崩溃的原因来让我们可以更合理的使用Kafka。

你可以试着在一台普通的Linux机器上创建10000个分区的主题。比如下面示例中创建一个主题topic-bomb:

执行完成之后你可以检查一下Kafka的进程是否还存在(比如通过jps命令或者ps -aux|grep kafka命令)。一般情况下,你会发现原本运行完好的Kafka服务已经崩溃。此时,你或许会想到,创建这么多个分区,是不是内存不够而引起的进程崩溃,我在启动Kafka的时候将JVM堆设置的大一点是不是就可以解决了。其实不然,创建这点儿分区而引起的内存增加完全不足以让Kafka畏惧。

想要知道真相,我们可以打开Kafka的服务日志文件($KAFKA_HOME/logs/server.log)来一探究竟,你会发现服务日志中出现大量的如下异常:

异常中最关键的信息是:“Too many open flies”,这是一种常见的Linux系统错误,通常意味着文件描述符不足,它一般会发生在创建线程、创建Socket、打开文件这些场景下。在Linux系统中的默认设置下,这个文件描述符的个数不是很高,可以通过ulimit查看:

ulimit是在系统允许的情况下,提供对特定shell可利用的资源的控制。(Provides control over the resources avaliable to the shell and to processes started by it, on systems that allow such control)

-H和-S选项设定指定资源的硬限制和软限制。硬限制设定之后不能再添加,而软限制则可以增加到硬限制规定的值。如果-H和-S选项都没有指定,则软限制和硬限制同时设定。限制值可以是指定资源的数值或者hard、soft、unlimited这些特殊值,其中hard代表当前硬限制, soft代表当前软件限制, unlimited代表不限制。如果不指定限制值, 则打印指定资源的软限制值, 除非指定了-H选项。硬限制是可以在任何时候任何进程中设置  但硬限制只能由超级用户提起。软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值

我们可以通过测试来验证一下本案例中的Kafka崩溃是否是由于文件描述符的限制而引起的。首先启动Kafka集群,集群中有3个节点,配置一样。挑选其中的一台节点node1做具体分析,通过jps命令我们可以查看到kafka的进程pid的值:

查看当前Kafka进程所占用的文件描述符的个数(注意这个值并不是Kafka第一次启动时就需要占用的文件描述符的个数,示例中的Kafka环境下已经存在了若干主题):

我们再新建一个只有一个分区的主题,并查看Kafka进程所占用的文件描述符的个数:

可以看到增加了一个分区对应的也只增加了一个文件描述符。

之前我们通过ulimit命令可以看到软限制是1024,不妨我们就创建一个具有829(1024-195=829)个分区的主题:

可以看到Kafka进程此时占用了1024个文件描述符,并且运行完好。这时我们还可以联想到硬限制4096这个关键数字,不妨我们再创建一个包含有3071(4096-1024=3072,这里特定少创建1个分区)个分区的主题,示例如下:

Kafka进程依旧完好,文件描述符占用为4095,逼近最高值4096。最后我们再次创建一个只有一个分区的主题:

此时Kafka已经崩溃,查看进程号时已没有相关信息。查看Kafka中的日志,还会发现报错文章开头的异常“java.io.IOException: Too many open files”,表明已到达上限。

如何避免这种异常情况?对于一个高并发高性能的应用来说,1024或者4096的文件描述符限制未免太少,可以适当的调大这个参数。比如使用ulimit -n 65535命令将上限提高到65535,这样足以应对大多数的应用情况,再高也完全没有必要了。

也可以在/etc/security/limits.conf文件中设置,参考如下:

limits.conf文件修改之后需要重启才能生效。limits.conf与ulimit的区别在于前者是针对所有用户的,而且在任何shell都是生效的,即与shell无关,而后者只是针对特定用户的当前shell的设定。在修改最大文件打开数时,最好使用limits.conf文件来修改,通过这个文件,可以定义用户,资源类型,软硬限制等。也可修改/etc/profile文件加上ulimit的设置语句来是的全局生效。

设置之后可以再次执行文中开头的创建10000个分区的主题的命令,试一下,Kafka是否还会再次崩溃?

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:744677563

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

如何把一个运行完好的Kafka搞崩相关推荐

  1. 如何把一个运行完好的Kafka搞崩溃

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. 构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序

    \ 关键要点 \\ 从GitHub中获取一个简单的Spring Boot Java应用程序.\\t 将应用程序连接到Azure MySQL数据库服务.\\t 在Azure上配置一个运行WildFly的 ...

  3. Java黑皮书课后题第8章:*8.8(所有最近的点对)修改程序清单8-3,找出所有所有具有最小距离的点对。下面是一个运行示例

    *8.8(所有最近的点对)修改程序清单8-3,找出所有所有具有最小距离的点对.下面是一个运行示例 题目 题目描述与运行示例 程序清单8-3 破题 代码 题目 题目描述与运行示例 *8.8(所有最近的点 ...

  4. Mobius 一个运行在 .NET Core 上的 .NET 运行时

    导语 一个 .NET 应用仅仅只是一块在 .NET 运行时上面运行的二进制代码.而 .NET 运行时只是一个能执行这项任务的程序.当前的 .NET Framework 和 .NET Core 运行时采 ...

  5. linux 程序占内存,linux下,一个运行中的程序,究竟占用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 通常的命令有php (1). ps aux:html 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存.linux RSS列 ...

  6. 一个应届生是怎样搞定google、微软、百度、腾讯、搜狗的

    http://blog.csdn.net/jobtong/article/details/9017975 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回 ...

  7. sae-v2ex 一个运行在SAE上的类似v2ex的轻型python论坛 - 技术讨论 - 云计算开发者社区 - Powered by Discuz!...

    sae-v2ex 一个运行在SAE上的类似v2ex的轻型python论坛 - 技术讨论 - 云计算开发者社区 - Powered by Discuz! sae-v2ex 一个运行在SAE上的类似v2e ...

  8. Bugku-web进阶之phpcmsV9(一个靶机而已,别搞破坏。flag在根目录里txt文件里)

    phpcmsV9 一个靶机而已,别搞破坏. flag在根目录里txt文件里 http://123.206.87.240:8001/ 本题要点:目录扫描 打开网页 根据提示:一个靶机而已,别搞破坏.fl ...

  9. 不要做一个「永远没彻底搞懂」诸如递归等概念的程序员

    Don't be the person who "never quite understood" something like recursion. https://teachyo ...

最新文章

  1. 为什么三层交换机无法替代路由器?
  2. 区块链分布式账本Hyperledger Fabric介绍
  3. 质数环问题c语言,素数环问题
  4. =在php中,PHPExcel在PHP7中,save(‘php://output’)出现ERR_INVALID_RESPONSE错误的解决方法...
  5. pstack命令学习
  6. python 用if判断一个数是不是整数_Python基础教程07-函数和模块的使用
  7. y空间兑换代码_loam代码解析3
  8. DevExpress ChartControl 绘制圆滑曲线
  9. oracle和plsqldev的安装,win7x64下成功安装ORACLE客户端和PLSQLDEV!
  10. InstantClient+PLSQL安装配置教程
  11. Ladon8.9扫描器简明教程/用法例子
  12. 计算机设备自动关机,怎样设置电脑自动关机时间,电脑设置自动关机时间-
  13. linux的常用命令
  14. IDEA 2017.3.4 破解到2099年方法
  15. Android 查询局域网内所有ip和mac地址
  16. 高效率的免费发布信息平台,助力企业高质量采购
  17. 玩客云安装青龙面板实现京东签到薅羊毛
  18. 汇川使用笔记1:汇川AM402-PLC固件版本升级
  19. 4296. 【NOIP2015模拟11.2】有趣的有趣的家庭菜园
  20. python全套数据分析课程_B 站疯传,堪称最强,一整套Python数据分析课程,学完月薪30K+!...

热门文章

  1. JavaScript高级使用(一)--参数Arguments对象
  2. 计算机用键盘能干什么,年轻人的第一块智能键盘-半台MBP能干什么?
  3. 游戏 发烧型计算机配置清单,这才是发烧级硬件玩家的电脑配置清单
  4. think php 3.2.3 环境,ThinkPHP 3.2.3 入口文件配置
  5. 高程加密lisp程序_lisp修改,怎么把这个加密程序那句去掉,小白求大神帮帮我...
  6. linux php和java环境变量配置_java_linux配置java环境变量详细过程,直接上实现过程: 一. 解压安 - phpStudy...
  7. php简单记账本_介绍你3个记账本小程序,让你花钱有规划
  8. python接管已经打开的浏览器_Python Webdriver 从新使用已经打开的浏览器实例
  9. 学习vue3系列ref
  10. ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?