线上问题排查
系统慢看cpu和内存,报错看日志,接口慢也看日志。
而且日志没错,返回的数据正确肯定是前端的问题。
实在是找不到报错,用户也忘了报错的时间,就让他再复现一次错误,我们这边再去看日志。
测试系统去debug
接口慢:
第一步习惯性看jvm有没有异常,服务器的spu和内存都看看。
先用arthas
第二步使用explain排查索引命中情况。
第三步优化代码,是否能异步处理
整个系统变慢:
看jvm,服务器的cpu和内存
接口报错:
问客户报错的时间点,报错的频率,报错的截图。看日志,用grep关键字过滤error和时间点,(不然会过滤出全部的error),然后再使用grep -c过滤刚才报错中的关键字的上下文,看报错原因,看是第几行代码。
特别紧急的话,先回滚版本。再去解决。
慢sql
第一步:开启慢查询日志
第二步:设置阈值
第三步:日志记录后,使用explain进行分析。
有没有用到索引,像多表的关联字段,条件查询字段,能走索引尽量走索引。
创建索引:creat index 索引名 on 表名(字段名)
优化sql:尽量走覆盖索引
文件导入导出
文件大的话很容易内存溢出
可以逐行处理,避免一次性把文件的所有内容加载到内存
也要检查一下堆内存大小,经常导入导出,1g很容易就不够用了啊
jvm
正常full gc可能几个小时几天才做一次,那几分钟做一次肯定对网站性能有影响
分析gc日志尽量用工具,自己看还是很复杂的
开启gc日志,用GCViewer工具看下full gc频率,每次full gc的执行时间,比如每次3秒,每次用户卡3秒就体验很不好,对网站性能就有很大的影响。
full gc后,老年代内存使用率在80%以上,很有可能有内存泄漏的问题
像集合的list,map,这种集合很容易内存溢出
工具:visualvm,jconsole,jmp(线上导出dump文件,系统会停顿),MAT
---------------------------------------------------------------------------------------------
堆,栈,元空间(永久代)
总内存 ≈ 堆内存 (-Xmx) + (线程数量 × -Xss) + 其他
-xmx=最大堆内存
-xms=初始堆内存
-xss=栈大小
-xx:这个参数设置的东西挺多

“-XX:SurvivorRatio” 默认值为8.伊甸园:s0:s1=8:1:1
“-XX:NewRatio”:默认值是2.老年代/新生代=2
早生夕死的对象坚决不能进入老年代
不能因为survivor区太小导致直接进入老年代
动力节点把新生代的年龄15岁改成5岁,我服了。
堆大小小于6g,使用cms垃圾回收器,大于等于6g,使用g1垃圾回收器
"XX:+UseConcMarkSweepGC":老年代使用cms垃圾回收器
"XX:+UseParNewGC":新生代使用ParNew垃圾回收器

服务器cpu飙高
top查看占cpu高的java进程
jstack 进程号 > xxx.txt 把线程堆栈输出到xxx.txt文件
top -H -p 进程号 找到进程中占cpu高的线程
线程号转16进制,然后去xxx.txt文件中搜索,找我们的包名,定位到代码行
服务器内存飙高
top+ (shift+m)内存排序。可以找到占内存大的进程
jps:看下是哪个jar包,就知道是哪个项目了
jmap -histo 进程号:打印堆的使用情况
jmap -histo 进程号 | grep '包名'。类太多了,过滤出我们的包名,找到哪个类的对象多。
jmap -dump:format=b,file=heap.hprof pid,把进程堆内存快照(Heap Dump)导出来(注意,这个文件有可能很大,线上导出必须谨慎),人家说把其中一个服务器从负载均衡上摘下来,再去执行这个命令。
后面动力节点用MAT工具分析gc root找到代码
-histo查看堆内存中的对象实例数目,内存占用大小,类名等。
我悟了,这个就是排查内存泄漏的吧
日志排查:
一般其他部门的邮件过来说有bug,
tail -n 500 supply.log,这个命令适合日志少的文件,有些项目日志实在太多,不好找error。
cat supply.log | grep "09:1[5-9]",这个命令查看九点15到九点19的日志,也不一定找得到。
cat supply.log | grep "0[8-9]" | grep -i "error",这个命令就很好用,过滤时间和关键字'error'。
grep -C 10 "ACTION_DATE" supply.log,找到出bug的字段ACTION_DATE,然后查看上下文,-C就是查看日志上下文的命令。
(第一次不熟练,其实直接过滤时间和查看error关键字的上下文就行)
-------
日志太大,用tail也找不到,一定要过滤时间,不然真的找不到的。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)