一.网站访问慢案例套路
网站访问慢,可能有多种情况,这里主要是mysql数据库慢引起的排除情况。
1.show full processlist;进行查看,通常查询结果是空,如果执行两遍,结果都是一样的,那么基本就能确定是这条语句了。
2.在my.cnf中,
log-slow-queries= /data/3306/show.log
19:53:30 up 1 day, 3:53, 3 users, load average: 0.00, 0.00, 0.00
4.对于查询出来的语句,要排查是否走了索引,查看索引情况:
explain sql语句 ---查看sql是否走了索引
select SQL_NO_CACHE sql语句 --不走缓存的查询sql语句
例如:select count(distinct ader) from ad_odlboy_detail;
创建联合索引:
create index d_a_p on ad_olboy_detail(dateline,ader(20),pos(20));
一般在数据库进行了阻塞后,整体网站打开是非常慢的,但是因为%%的原因,无法通过索引进行处理,这里给出4中方案:
1)从业务上解决,让用户登陆上再进行搜索,减少一部分用户的搜索情况
3)配置主从同步,读写分离
背景:通过性能监控发现上线服务器cpu某核占用率已经达到了100%,而且是由我们的某个核心服务导致的。幸亏由于我们的服务进程由多个相同worker(线程)调度承担的,所以除了CPU占用率高之外,并没有对服务造成影响。随着上次我们找到那个吃IO的罪犯,这次我们要追捕的是潜伏在团体中的特务,更加惊险刺激哟!
系统环境
用top命令很容易定位到是谁占用CPU最高。
以我们的这个业务进程(imDevServer)举例,为什么说这货是个潜伏者呢?因为这是个多线程的进程,我们要知道实际上占用cpu的最小单位是线程,所以肯定是众线程中的某一个或几个占用CPU过高导致的。top -H -p pid命令查看进程内各个线程占用的CPU百分比
如上图所示我们可以看出id为8863的线程cpu占用率最高。好,我们现在只要能找到他偷走的cpu就好了,虽然这小子嘴巴严,但是我们有一套完善的审问流程,不怕他不招。首先出马的是strace -T -r -c -p pid命令
它的作用是查看系统调用和花费的时间,epoll_wait虽然占用的调用时间多,但是他本身是个正常的阻塞调用。
我们接着让pstack pid出马
可以看到每个线程的调用堆栈,找到已经找出的占用CPU最高的那个线程,然后看他的调用堆栈,很容易看出在哪一步逻辑上导致了busy loop,
再使用trace -p tid看看线程的调用过程接着定位到代码,修复bug,找回被偷走的cpu。
推荐:linux trace命令详解 https://blog.csdn.net/chtnj/article/details/79072549