html5网站都有那个,管理学课程,郑州注册公司代理记账,哈尔滨做设计和网站的公司国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于雇主最看重哪些核心能力的调查#xff0c;结果显示如下#xff1a;排名前几的比较受重视的能力分别为#xff1a;解决问题、编程语言熟练程度、Debug、系统设计和性能优化。解决问题的能…国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于雇主最看重哪些核心能力的调查结果显示如下排名前几的比较受重视的能力分别为解决问题、编程语言熟练程度、Debug、系统设计和性能优化。解决问题的能力以超高比例排名第一这也是为什么很多面试过程中面试官都喜欢问如下问题1、你这个项目遇到的最大挑战是什么如何解决的2、如果线上发生了报警你回如何排查呢3、你有解决过什么线上问题吗4、能列举几个你知道的排查Linux服务器线上问题的命令吗这些都是比较常见的问题还有一些比较具体的问题也是建议很多开发者都需要掌握的如1、线上服务器Load飙高如何排查2、线上服务器CPU占用率高如何排查3、线上服务器频繁发生Full GC如何排查4、线上服务器发生死锁如何排查这些问题的回答一方面考察了面试者是否具有很强的实战经验另外一方面也能体现出其解决问题的能力。毋庸置疑作为开发人员来说定位并解决问题的能力是至关重要的。因为一旦线上发生了问题如CPU占用率高如果不及时解决很容易导致网站响应慢、服务器宕机等问题。那么书归正传本文我们就来简单介绍一下如果线上服务器发生CPU占用率过高的问题时应该如何排查并定位问题。一、问题发现本文整理自一个真实的案例是楼主负责的业务在一次大促之前的压测时发现了这个问题。在每次大促之前我们的测试人员都会对网站进行压力测试这个时候会查看服务的cpu、内存、load、rt、qps等指标。在一次压测过程中测试人员发现我们的某一个接口在qps上升到500以后CPU使用率急剧升高。CPU利用率又称CPU使用率。顾名思义CPU利用率是来描述CPU的使用情况的表明了一段时间内CPU被占用的情况。使用率越高说明你的机器在这个时间上运行了很多程序反之较少。二、问题定位遇到这种问题首先是登录到服务器看一下具体情况。定位进程登录服务器执行top命令查看CPU占用情况$top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 1893 admin 20 0 7127m 2.6g 38m S 181.7 32.6 10:20.26 javatop命令是Linux下常用的性能分析工具能够实时显示系统中各个进程的资源占用状况类似于Windows的任务管理器。通过以上命令我们可以看到进程ID为1893的Java进程的CPU占用率达到了181%基本可以定位到是我们的Java应用导致整个服务器的CPU占用率飙升。定位线程我们知道Java是单进程多线程的那么我们接下来看看PID1893的这个Java进程中的各个线程的CPU使用情况同样是用top命令$top -Hp 1893 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 4519 admin 20 0 7127m 2.6g 38m R 18.6 32.6 0:40.11 java通过top -Hp 1893命令我们可以发现当前1893这个进程中ID为4519的线程占用CPU最高。定位代码通过top命令我们目前已经定位到导致CPU使用率较高的具体线程 那么我么接下来就定位下到底是哪一行代码存在问题。首先我们需要把4519这个线程转成16进制$printf %x 451911a7接下来通过jstack命令查看栈信息$sudo -u admin jstack 1893 |grep -A 200 11a7HSFBizProcessor-DEFAULT-8-thread-5 #500 daemon prio10 os_prio0 tid0x00007f632314a800 nid0x11a2 runnable [0x000000005442a000] java.lang.Thread.State: RUNNABLE at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684) at sun.misc.URLClassPath.findResource(URLClassPath.java:188) at java.net.URLClassLoader$2.run(URLClassLoader.java:569) at java.net.URLClassLoader$2.run(URLClassLoader.java:567) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findResource(URLClassLoader.java:566) at java.lang.ClassLoader.getResource(ClassLoader.java:1093) at java.net.URLClassLoader.getResourceAsStream(URLClassLoader.java:232) at org.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248) at org.hibernate.validator.internal.xml.ValidationXmlParser.getValidationConfig(ValidationXmlParser.java:191) at org.hibernate.validator.internal.xml.ValidationXmlParser.parseva lidationXml(ValidationXmlParser.java:65) at org.hibernate.validator.internal.engine.ConfigurationImpl.parseva lidationXml(ConfigurationImpl.java:287) at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:174) at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111) at com.test.common.util.BeanValidator.validate(BeanValidator.java:30)通过以上代码我们可以清楚的看到BeanValidator.java的第30行是有可能存在问题的。三、问题解决接下来就是通过查看代码来解决问题了我们发现我们自定义了一个BeanValidator封装了Hibernate的Validator然后在validate方法中通过Validation.buildDefaultValidatorFactory().getValidator()初始化一个Validator实例通过分析发现这个实例化的过程比较耗时。我们重构了一下代码把Validator实例的初始化提到方法外在类初始化的时候创建一次就解决了问题。四、总结以上展示了一次比较完成的线上问题定位过程。主要用到的命令有:top 、printf 和 jstack另外线上问题排查还可以使用Alibaba开源的工具Arthas进行排查以上问题可以使用一下命令定位thread -n 3 //查看cpu占比前三的线程以上本文介绍了如何排查线上服务器CPU使用率过高的问题如果大家感兴趣后面可以再介绍一些关于LOAD飙高、频繁GC等问题的排查手段。关于本次问题排查你有什么想说的呢欢迎交流。