FileBeat CPU占用率过高Case处理 | max_procs: 1

 Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,进入学海无涯,高人带路模式!!Filebeat​再难,有人带路,轻松搞定

Case: Filebeat内存占用率过高
处理​方案
max_procs: 1
问题渐进明细,遇到这种别人的东西CPU占用率过高,是不太好下手的​。解决这个问题的思路有2个,1是网上找踩过坑的资料,2是再现一下问题,寻找​思路。
一、找资料
FileBeat出现cpu占用过高,有说是FileBeat版本与kafka版本不一致,也有说监控文件过多,没有及时inactive的,还有就是限制c​pu使用数量的。最开始找资料的时候,并没有太看到限制cpu核数的​。所以​踩坑还是一踩到底。
二、再现问题
2.1 LogAuto模拟大量日志
为了重现问题,在本地启动一个Filebeat,输出为控制台,采集目录有多个,写了一个日志生成小工具。
using System;using System.Collections.Generic;using System.Configuration;using System.IO;using System.Linq;using System.Text;using System.Threading;namespace LogAuto{    class Program    {        static void Main(string[] args)        {            String siteName = ConfigurationManager.AppSettings["siteName"]??"default Site";            // 模拟 100个站点            List<LogThread> logThreadPool = new List<LogThread>();            for(int i=0;i<100;i++){                LogThread logThread = new LogThread();                logThread.logTag = String.Format("{0}", i);                logThread.siteName = siteName;                logThreadPool.Add(logThread);                new Thread(new ThreadStart(logThread.WriteLog)).Start();            }        }    }}
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;namespace LogAuto{    class LogThread    {        public String logTag { get;set;}        public String siteName { get;set;}        public void WriteLog() {            while (true)            {                File.AppendAllText(String.Format("{0}.log.log", logTag), String.Format("产生一条日志 {0} {1}\r\n", siteName, DateTime.Now));                Console.WriteLine(String.Format("{2}输出一条日志:{0} {1}", siteName, DateTime.Now, logTag));                //Thread.Sleep(1000);            }        }    }}

​不管启多少个LogAuto,生成日志,filebeat采集日志,完全看不出Filebeat有什么不爽,于是,​这个模拟算是失败了。连多行日志都没有模拟出来,也没有让Filebeat​有任何压力。

​2.2 模拟大量线上日志

using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Net;using System.Text;using System.Threading;namespace LoadTest{    class Program    {        static void Main(string[] args)        {            int threadCount = int.Parse(ConfigurationManager.AppSettings["ThreadCount"] ?? "1000");            int threadSleep = int.Parse(ConfigurationManager.AppSettings["ThreadSleep"] ?? "1000");            String targetUrl = ConfigurationManager.AppSettings["TargetUrl"] ?? "http://yue.ma/?fbtest";            List<Thread> logThreadPool = new List<Thread>();            for (int i = 0; i < threadCount; i++)            {                Thread tread = new Thread((m) =>                {                    while (true) {                        try                        {                            WebClient wc = new WebClient();                            String data = wc.DownloadString(String.Format("{0}?r={1}", targetUrl, DateTime.Now));                            Console.WriteLine(String.Format("线程 {0} 返回结果 {1} 时间 {2}", m, data, DateTime.Now));                            Thread.Sleep(threadSleep);                        }                        catch (Exception ex) {                            Console.WriteLine(ex.Message);                        }                    }                });                logThreadPool.Add(tread);                tread.Start(i);            }            Console.WriteLine("输入任意字符退出");            Console.ReadKey();        }    }}

​启动了多个LoadTest实例,线程数都1000,压力是上去了​。发现FileBeat没有任何压力,完全不对​劲。查看FileBeat日志,filebeat压根就没有工作,kafka\logstash\elasticsearch统统没有工作。

​ 2.3 完整的日志收集环境+模拟大量线上日志

​这里要推荐linux下实用的history命令,可以查看前辈们使用的命令​。

​history

      从history命令历史中去揣摩命令,其实是一种乐趣,但是效率不高。再次分享一下前辈总结出来的命令清单

    ​    ​玩日志系统必备的17条操作命令|启动zookeeper kafka logstash storm 查看日志 我手上最珍贵的命令集

    ​测试结果压力一上去,w2wp.exe占用的cpu自己都能跑满100%,有没有filebeat,这cpu都能到100%,开着filebeat,filebeat能抢走40%到80%的cpu,随着日志压力大小会有所变化。

    ​2.4 完整的日志收集环境+模拟大量线上日志+Filebeat限制cpu

    ​当业务忙的时候,日志也多,这个时候,日志收集​就不要抢戏了。做为测试环境,配置​低,就限制1个cpu内核。开启压测后,显示Filebeat的cpu被限制在20%以下,不会出现Filebeat抢占过高的业务​资源。

​​小结:本次Filebeat占用CPU过高的case处理,最终的结论是max_procs: 1,为了这13个字符,设计了多种压测环境,回过头来想想,其实一开始就想限制cpu使用,万万没有想到是max_procs​。资源是有限的, cpu、内存,都是这样子​。嗯,cpu就这么控制一下​!​

作者:钟代麒

出处:http://www.jishudao.com/
版权归作者所有,转载请注明出处

发表评论

电子邮件地址不会被公开。 必填项已用*标注