无挑战,不
工作之 -系统分析师
招聘答案
作者:caoz来源:百度空间 酷勤网收集2010-09-05
题目:
题目1 很简单,某mysql数据库服务器A,出现mysql链接过多,导致前端
web服务器无法打开数据库连接,现在,由你来解决这个问题。
题目1之问题1:你会以怎样的步骤来处理这个事情。请注意,步骤
题目1之问题2:如何分析这一问题,共有几种可能性,每种可能性的分析方式,判别标准是什么。
题目1之问题3:针对不同可能性,给出尽可能完整的解决途径。
不要告诉我您会修改mysql链接参数,如果您只想到这一条,不要来信了。
题目2: 某linux服务器平时负载很轻,cpu在10%-20%之间,但是每周都会有几天在不定时间突然跃升到100%,然后导致该服务器拒绝一切响应(包括ssh链接在内),无奈之下只能电话通过机房重启。
现在,负载飙升时无法连接ssh,暂时无法确认负载飙升原因,请给出你想到的处理步骤和解决思路。
不要告诉我您会设置一个24小时短信提醒,那是最基本基本的了。
题目3:某linux 服务器一直负载很轻,但是会突然拒绝正常的服务,此时仍然可以登录,仍然看到在线很轻的负载,请告诉我你分析排查的思路。
参考答案:
1数据链接过多,这是最常见的问题,但是其实也是这里最重点的问题
子问题1,为什么提到步骤,很少有人告诉我,第一步是尽快临时恢复线上应用,这就是意识!
恢复线上应用有几种场景,最简单的是show processlist 然后kill掉阻塞的processlist,其次是重启数据库,如果数据库重启后又会快速堵塞,那么要尽快从前端代码中找到阻塞点,临时屏蔽掉某些导致阻塞的功能,以及增加同时链接参数,为了保证在你彻底解决这个问题的这段时间里,你的前面网页是可以顺利打开的。
这里存在一个小问题,如果是面试我会单独提出来,你怎么保证连接过多的情况下,后面还能看到show processlist,这里的窍门是,前段务必不要使用root连接数据库,这样
mysql后端root仍然会多出一个进程来满足查询要求。 之前我跟工程师说这个问题,他们果然换了一个账号,一个不叫root但是权限是root的账号在前端连接数据库,害的我郁闷了n多天找不到阻塞点。
第二步是确认阻塞点和阻塞方向,为什么说阻塞方向,因为数据库的阻塞,并不一定都是数据库造成的,连带影响非常多,通过show processlist ,如果看到大量的Lock,那么其一是代码优化,其二是改造数据引擎,如果Lock不多,而执行中查询很多,其一是索引优化,其二是数据库参数优化,有人说会看慢查询,慢查询很重要,但是不够的,
对于高并发来说,一个常见SQL执行0.1秒都是不可容忍的,通常这是索引不彻底造成的,比如简单来说 ,如果有个同城速配的常见SQL select from users where sex='女' and area='厦门' order by lastlogin desc ,这么一个查询,你会怎么建立索引?我告诉你,三键复合索引!少一个效率都不行. 而且顺序还必须保证! 之前非常多发现因为复合索引不到位,导致数据查询执行0.05 -0.1秒的准慢查询,通过set profiling是可以分析的,优化后效率提升10-100倍。 此外,连带影响也是一个大问题,比如说,有时候你会看到大量SLEEP链接,那多半是前段执行完SQL没有及时关闭,之前我的博客如果有认真阅读的,会看到因为echo影响,因为memcache链接阻塞影响都会存在,当然还有一种,网络带宽阻塞影响,Waiting for net状态阻塞,
这里确认阻塞点和阻塞方向,最关键的是思路要足够发散,不要只看数据库配置,或者数据索引;前端程序,网络环境(曾经因为别人的外挂程序,以及代码不严谨,导致内网网卡阻塞,数据库连接过多)都需要考虑周全,所以有些答案caoz回复说思路不开阔,就是这个原因。这里具体分支场景