首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一次ES故障排查过程

    思路:现象是阻塞,通常是 CPU 彪高,导致业务线程分配不到 CPU 时间片,或者内存吃紧,频繁 GC 导致的 STW。登录到目标服务器,由于 ES 的用户不是 LZ,因此找运维要了 root 权限,登录到服务器。sudo -i 切到 root,使用 ps -ef | grep Elasticsearch 找到该用户,然后 su - es 切到 es 用户(不切是无法处理 es 用户的 Java 进程的,例如打印 jstack 日志)。 top 查看服务器状态,发现 pid 4335 进程的 CPU 占用达到 180%,查看 CPU 核数:cat /proc/cpuinfo| grep “processor”| wc -l, 核数为 4,根据经验,通常是 C2 编译器,或者 GC 线程,最后是业务代码导致。因此需要定位该线程。使用 top -Hp 4335,得到线程号 30785,使用 printf "%x" 得到 16 进制数字 7841,方便在 jstack 日志查找线程。使用 jstack -l 4335 > jstacklog.txt 打印日志,然后找线程,vim jstacklog.txt, 开始查找,gg,/7841,enter,n, 找到 "Concurrent Mark-Sweep GC Thread" os_prio=0 tid=0x00007fd380063800 nid=0x7841 runnable 这个 CMS GC 线程,看来是内存不够了。 使用 jps -l 找到 es 启动类名称,然后使用 ps aux | grep Elasticsearch 找到启动详细信息,发现启动配置为 -Xmx2g -Xms2g, -XX:CMSInitiatingOccupancyFraction=50 ,这里为了防止串行 FGC,让 CMS 在 old 区达到 50% 时就开始 GC,所以 CMS 非常繁忙。为了验证此问题,使用 jstat -gcutil 4335 1000 查看 gc 状态,发现 fgc 频繁(5 秒一次),ygc 正常(3 秒一次) ,这里说一下,CMS 的 fgc 此时和我们想象的不一样,CMS GC 只工作在老年代,每次 GC 会对 FGC 次数加 2,一次是 init mark,一次是 remark,这两个阶段会影响暂停应用,其他的清理阶段是并行清理的,对业务线程无影响,所以,当使用 CMS GC ,如果 jstat 看到 FGC 次数很多,不用在意。但当 CMS 出现 concurrent mode failure(CMS GC 的速度赶不上对象晋升到 old 区的速度),则会使用备用收集器 Serial,开始串行 GC,此时将会彻底 STW。 因此,这个 ES 将 CMS 的阈值调的很低,就是为了防止出现 concurrent mode failure。

    01

    Linux vmstat命令实战详解

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。  选项 -a:显示活动内页; -f:显示启动后创建的进程总数; -m:显示slab信息; -n:头信息仅显示一次; -s:以表格方式显示事件计数器和内存状态; -d:报告磁盘状态; -p:显示指定的硬盘分区状态; -S:输出信息的单位。 vmstat 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st  0  0    320  42188 167332 1534368    0    0     4     7    1    0  0  0 99  0  0  0  0    320  42188 167332 1534392    0    0     0     0 1002   39  0  0 100  0  0  0  0    320  42188 167336 1534392    0    0     0    19 1002   44  0  0 100  0  0  0  0    320  42188 167336 1534392    0    0     0     0 1002   41  0  0 100  0  0  0  0    320  42188 167336 1534392    0    0     0     0 1002   41  0  0 100  0  0 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数 r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。 b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。 swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。 free   空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。 buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。) si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。 so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。 bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒 bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。 in 每秒CPU的中断次数,包括时间中断 cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源

    02
    领券