发博客系统繁忙怎么回事 发博客系统繁忙怎么回事儿( 二 )


尝试繁殖!
检查日志我对需要包括这一点感到抱歉 。但有一次我看到有人在跑 tail /var/log/... 几分钟后 , 我停止了观看 。大多数 *NIX 工具特别喜欢伐木 。任何明显的错误都会在大多数应用程序日志中凸显出来 。仔细讨论 。
缩小范围如果没有明显的问题 , 但你可以重现所报告的问题 , 那也很棒 。所以 , 现在你知道网站很慢 。现在你已经把范围缩小到:浏览器的渲染/错误、应用代码、DNS 基础设施、路由器、防火墙、网卡(所有的)、以太网电缆、负载平衡器、数据库、缓存层、会话存储、Web 服务器软件、应用服务器、内存、CPU、RAID 卡、诸如此类 。
根据设置添加一些其他可能的罪犯 。它们也可能是 SAN , 别忘了硬件 WAF!以及…… 你知道我的意思 。
如果问题是接收第一个字节的时间 , 你当然会开始 。是 Web 在服务器上应用已知的修复程序 , 就是它响应缓慢 , 你也觉得差不多了 , 对吧?但是你错了!
你要回去尝试繁殖这个问题 。只是这次 , 你应该尽可能地消除潜在的问题来源 。
你可以很容易地排除大多数可能的罪犯:你能从服务器本地重现这个问题吗?恭喜 , 你刚刚救了你自己 , 必须试着去弥补 BGP 路由时间 。
不然的话 , 尝试使用同一网络上的另一台电脑 。如有可能 , 至少你可以把防火墙移到你的嫌疑名单里 , (但是注意那个开关!)
所有连接都很慢吗?虽然服务器是 Web 服务器 , 但这并不意味着您不应该尝试使用其他类型的服务来重现该问题 。netcat 在这些情况下非常有用(但是你的 SSH 连接可能总是有延迟 , 这可以是一个线索)! 如果这也很慢 , 至少你知道你可能有网络问题 , 你可以忽略整个 Web 软件及其所有组件的问题 。有了这些知识(我不收 200 美元)从头再来 , 从里到外按你的方式去做!
即使你能在本地复制它 —— 还有很多“因素”留下 。先排除一些变量 。能用普通文件重现吗? 如果 i_am_a_1kb_file.html 很慢 , 你知道这不是数据库、缓存层或 OS 除了和以外的任何内容 Web 服务器本身的问题 。
可以用一个需要解释或者执行的 hello_world.(py|php|js|rb..) 文件复制问题?如有可能 , 你已经缩小了范围 , 你可以专注于几件事 。如果 hello_world 你可以马上工作 , 你还是学到了很多!你知道 , 没有明显的资源限制、任何完整的队列或卡在任何地方 IPC 调用 , 这就是应用程序正在做的事情或正在与之通信的内容 。
所有页面都很慢吗?或者只是从第三方加载的“实时得分数据”这一页很慢?
归结起来就是:你仍然可以重现这个问题所涉及的最小值“因素”是什么?
我们的例子是一个缓慢的网站 , 但这同样适用于几乎所有的问题 。邮件传递?你能在本地送货吗?可以发给自己吗?能发给<公共服务提供商>吗?用小的、纯文本消息 。试着直到你遇见 2MB 拥堵时 。使用 STARTTLS 而且没用过 STARTTLS 呢?从里到外按你的方式去做!
每个步骤只需要几秒钟 , 远远快于大多数“可能的”修复方案 。
隔离观察迄今为止 , 当您移除特定组件后无法重现问题时 , 你可能偶然发现了这个问题 。
但是如果你还没有 , 或者你还不知道为什么:一旦你找到了重现问题的方法 , 在你和问题之间“东西”(一个技术术语)最少 , 然后就该开始隔离观察了 。
请记住 , 许多服务可以在前台运行/或者启用调试 。对于某些类型的问题 , 这样做通常很有帮助 。
这也是你的传统武器发挥作用的地方 。strace、lsof、netstat、GDB、iotop、valgrind、语言分析器(cProfile、xdebug、ruby-prof ……)什么样的工具 。
一旦你到了这一步 , 您很难摆脱分析器或调试器 。
strace 通常是一个很好的起点 。
您可能会注意到应用程序停留在某个连接端口 3306 特定于套接字文件描述符 read() 调用上 。你会知道该怎么做 。
转到 MySQL 并从头再来 。明显地:“等待锁定”、死锁、max_connections ……进而:是 , 所有查询?还是直接写个请求?只有一些桌子?或者只是一些存储引擎?等等……
您可能会注意到 , 拨打外线 API 资源的 connect() 完成需要五秒钟 , 甚至超时 。你会知道该怎么做 。