SlideShare a Scribd company logo
1 of 29
Download to read offline
出了问题不要靠猜 
LI Daobing <lidaobing@gmail.com> 
! 
七牛云存储 
2014-03-31 北京
! 
• 李道兵 <lidaobing@gmail.com> 
• 先后任职于金山,盛大,GIGA循绿,七牛 
• 现在在七⽜牛做⾸首席架构师 
• 关注领域: 服务端安全, 质量保障, 运维⾃自动化, DevOps 
• Github: http://github.com/lidaobing 
• SpeckerDeck: https://speakerdeck.com/lidaobing
目录 
• 从一个 Bug 讲起 
• 我看到的乱象 
• 我推荐的解决方案
一个奇怪的 Bug 
• 网盘的上传服务 
• Windows 下 IE, Chrome 浏览器下正常 
• Linux 下 Firefox, Chrome 浏览器下正常 
• Windows 下的 Firefox 不正常, 上传失败。
如何定位Bug 
• 首先查看浏览器的控制台,观察是否有错误(都没有) 
• 用 Wireshark 截获请求包,发现失败的案例服务端返 
回412(通常为200) 
• 对⽐比 HTTP Request,发现失败案例的 HTTP 头有 
“Content-length”,而其他情况下为 “Content-Length” 
• 用 telnet 发送不同的请求来验证结论
如何定位Bug 
• 确认原因是服务端对 Content-Length 的大小写敏 
感,与标准不符,造成了这个 Bug 
• 通知服务端开发人员尽快修复
好Bug/坏Bug 
• 能再现的 Bug 就是好 Bug 
• 如果不能再现,能拿到异常栈或者详细日志的也是好 
Bug 
• 对于坏 Bug, 他的最大用处就是督促你补充日志
另一个奇怪的Bug 
• 从公司访问网站有12s延迟 
• 直接 ping 响应很快 
• 从其他网络来源访问没有问题 
• 监控没有问题, 也没有客户来抱怨此事
先猜猜看 
• 公司路由出问题了? 
• 重启一下路由试试看? 
• 但为什么只有访问我们自己网站会出事? 
• 人品问题? 
• 做程序员还是唯物一点比较好 
• 不管,反正没人抱怨这事 
• 99% 的用户会遇到问题时不会报告
分析 
• tcpdump抓包 
• 客户端: 发了6个 SYN 包,到最后一个才收到 SYN/ACK 
• 服务端: 确实收到了6个 SYN 包, 而且确实前面5个 SYN 
包都没有回复 
• 从其他网络访问,确实在首个 SYN 包之后返回 
• 结论: 问题跟路由/线路⽆无关,确实是服务端的问题
分析 
• 再重新分析 tcpdump 的记录,发现前5个 SYN 包带 
了 timestamp, 第6个没带 
• 尝试关掉客户端 TCP timestamp, 瞬间响应 
• 尝试关掉服务端 TCP timestamp, 瞬间响应 
• 结论: Bug 与 timestamp 相关,但仍然无法解释为什 
么其他网络没问题
解决方案A 
• 关掉服务端的 TCP timestamp 
• TCP timestamp 会影响传输速度,但影响不大 
• 疑问仍然存在,为什么服务器不响应某些 timestamp 
包, 有时候又能正常响应
分析 
• 看内核源码 (CTO 亲⾃自操⼑刀) 
• 入口机器有大量的反向代理,端口经常不够用,所以开启了 
TIME_WAIT 端口重用 
• 开启了 TIME_WAIT 端口重用后,服务端要求同一个IP的 SYN 
包 timestamp 必须是顺序的 
• 办公⺴⽹网络是内⺴⽹网, 并且对我们官网访问很频繁,导致故障发生 
• 看来找到真实的原因了, 有没有更好地解决方案?
解决方案B 
• nginx 高版本已经支持 keep-alive 
• 升级 nginx, 启⽤用 keep-alive, 降低端口占用 
• 关闭端口重用,并加强端口数的监控和报警
我所看到的乱象 
• 用寻找 workaround 代替解决问题 
• 换个浏览器吧 
• 重启, 清 cookie, 清 cache, 重新登录 
• 现场被破坏得干干净净 
• 对于那些不易再现的 Bug, 就损失了一次修复的机 
会
我所看到的乱象 
• 尝试⽤用试错法解决所有问题 
• 升级依赖包, 升级插件, ... 
• 随便猜一个原因,改两句代码,然后重新测试
我所看到的乱象 
• 缺少反省 
• 寻找到 workaround 便认为问题解决了 
• 没有用测试固化 Bug, 容易产生回归Bug 
• 一个 Bug 可能在多处出现,没有尝试搜索其他有 
Bug 的地方 
• 没有通过补充日志等手段来降低日后定位Bug的难度
我所看到的乱象 
• 海恩法则: 每一起严重事故的背后,必然有29次轻微 
事故和300起未遂先兆以及1000起事故隐患
我们推荐的方法 
• 出了问题不要靠猜 
• 浏览器 
• 服务端日志 
• 抓包工具
浏览器看什么? 
• 是否有 JS 错误? 
• 网络请求是否发出? 
• 发出的请求是否正确: URL, 方法, 参数, Accept, 
Cookie 
• 期望的返回值是什么? 
• Request-Id
Request-Id 
• 对每次请求产⽣生⼀一个唯⼀一的Id 
• 该 Id 以 HTTP Response Header 的方式发送到客户 
端 
• 可以在 nginx 层⾯面实现或者在业务逻辑层⾯面实现
服务端日志看什么? 
• 四要素 
• 时间: 开始时间,总耗时 
• 谁: 用户Id, Session-Id, Request-Id 
• 做什么: URL, 方法,XHR?, format, 参数(注意保护密 
码) 
• 结果是什么?
服务端日志看什么? 
• 对其他服务的请求 
• 邮件,短信,其他服务... 
• 记录请求详情和耗时
但是经常没有足够的日志 
• 但是经常没有足够的日志
wireshark tcpdump 
• 抓包工具 
• wireshark: 有界面 
• tcpdump: sudo tcpdump -n -s 4096 -w 1.log port 
80
其他工具 
• strace/dtruss: 系统调用跟踪工具 
• lsof: 列出文件打开情况 
• valgrind: 查内存泄露 
• ltrace: 查询库调⽤用
总结 
• 我们推崇通过一种系统的方法来分析问题,寻找问题的 
根源 
• 我们反对只靠试错法来解决问题 
• 能再现的 Bug 是好 Bug, 如果不能再现,也要拿到对应 
的网络请求和日志 
• 如果这次解决不了 Bug, 那么就改善你的日志,确保下 
次 Bug 出现的时候能解决他
我们团队
Q&A

More Related Content

What's hot

ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)Jeff Chu
 
Kafka cluster best practices
Kafka cluster best practicesKafka cluster best practices
Kafka cluster best practicesRico Chen
 
Open cdn快速部署你的私有cdn集群
Open cdn快速部署你的私有cdn集群Open cdn快速部署你的私有cdn集群
Open cdn快速部署你的私有cdn集群
 
快!快!快! 互联网第一条军规
快!快!快! 互联网第一条军规快!快!快! 互联网第一条军规
快!快!快! 互联网第一条军规yangdj
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Jeff Chu
 
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場twMVC
 
Wot2013云计算架构师峰会 -陈轶飞2
Wot2013云计算架构师峰会 -陈轶飞2Wot2013云计算架构师峰会 -陈轶飞2
Wot2013云计算架构师峰会 -陈轶飞2dotCloud
 
在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通電腦科學 實驗室
 
docker intro
docker introdocker intro
docker introkoji lin
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管Will Huang
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率Zhen Li
 
Azure mobileservice
Azure mobileservice Azure mobileservice
Azure mobileservice twMVC
 
The Application of OpenStack in 360buy, by Bin He
The Application of OpenStack in 360buy, by Bin HeThe Application of OpenStack in 360buy, by Bin He
The Application of OpenStack in 360buy, by Bin HeHui Cheng
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
用樹梅派控制馬達1208 第六組
用樹梅派控制馬達1208 第六組用樹梅派控制馬達1208 第六組
用樹梅派控制馬達1208 第六組誠樟 簡
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIChu-Siang Lai
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術Yu Lung Shao
 

What's hot (19)

ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
 
Kafka cluster best practices
Kafka cluster best practicesKafka cluster best practices
Kafka cluster best practices
 
Open cdn快速部署你的私有cdn集群
Open cdn快速部署你的私有cdn集群Open cdn快速部署你的私有cdn集群
Open cdn快速部署你的私有cdn集群
 
快!快!快! 互联网第一条军规
快!快!快! 互联网第一条军规快!快!快! 互联网第一条军规
快!快!快! 互联网第一条军规
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
 
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
雲端上的資訊安全-Global Azure Bootcamp 2015 臺北場
 
Wot2013云计算架构师峰会 -陈轶飞2
Wot2013云计算架构师峰会 -陈轶飞2Wot2013云计算架构师峰会 -陈轶飞2
Wot2013云计算架构师峰会 -陈轶飞2
 
在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通
 
Ansible introduction
Ansible introductionAnsible introduction
Ansible introduction
 
docker intro
docker introdocker intro
docker intro
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率
 
Azure mobileservice
Azure mobileservice Azure mobileservice
Azure mobileservice
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
The Application of OpenStack in 360buy, by Bin He
The Application of OpenStack in 360buy, by Bin HeThe Application of OpenStack in 360buy, by Bin He
The Application of OpenStack in 360buy, by Bin He
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
用樹梅派控制馬達1208 第六組
用樹梅派控制馬達1208 第六組用樹梅派控制馬達1208 第六組
用樹梅派控制馬達1208 第六組
 
Continuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CIContinuous Delivery Workshop with Ansible x GitLab CI
Continuous Delivery Workshop with Ansible x GitLab CI
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
 

Similar to 出了问题不要靠猜

該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?Andy Dai
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探美团点评技术团队
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
Frontend Devops at Cloudinsight
Frontend Devops at CloudinsightFrontend Devops at Cloudinsight
Frontend Devops at CloudinsightYan Wang
 
PyCon China 2012 孙毅
PyCon China 2012 孙毅PyCon China 2012 孙毅
PyCon China 2012 孙毅Yi Sun
 
郑焕义 重温网站重构
郑焕义 重温网站重构郑焕义 重温网站重构
郑焕义 重温网站重构Webrebuild
 
Reviews of Designing with Web Standards
Reviews of Designing with Web StandardsReviews of Designing with Web Standards
Reviews of Designing with Web Standardsavenirzheng
 
寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事Chieh (Jack) Yu
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計Amigo 陳兆祥
 
做自己的可可豆夾 @ cocoahead.tw
做自己的可可豆夾 @ cocoahead.tw做自己的可可豆夾 @ cocoahead.tw
做自己的可可豆夾 @ cocoahead.twKai-Yuan Cheng
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践丁 宇
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild裕波 周
 
石玉磊 Web rebuild
石玉磊 Web rebuild石玉磊 Web rebuild
石玉磊 Web rebuildWebrebuild
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelHo Kim
 
Nginx深度開發與客制化
Nginx深度開發與客制化Nginx深度開發與客制化
Nginx深度開發與客制化Joshua Zhu
 
Debug Your Kubernetes Network
Debug Your Kubernetes NetworkDebug Your Kubernetes Network
Debug Your Kubernetes NetworkHungWei Chiu
 
[students AI workshop] Pytorch
[students AI workshop]  Pytorch[students AI workshop]  Pytorch
[students AI workshop] PytorchTzu-Wei Huang
 
从开发到上线-实战持续交付
从开发到上线-实战持续交付从开发到上线-实战持续交付
从开发到上线-实战持续交付LI Daobing
 
開發工具與環境建置
開發工具與環境建置開發工具與環境建置
開發工具與環境建置Shengyou Fan
 

Similar to 出了问题不要靠猜 (20)

該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
Frontend Devops at Cloudinsight
Frontend Devops at CloudinsightFrontend Devops at Cloudinsight
Frontend Devops at Cloudinsight
 
PyCon China 2012 孙毅
PyCon China 2012 孙毅PyCon China 2012 孙毅
PyCon China 2012 孙毅
 
郑焕义 重温网站重构
郑焕义 重温网站重构郑焕义 重温网站重构
郑焕义 重温网站重构
 
Reviews of Designing with Web Standards
Reviews of Designing with Web StandardsReviews of Designing with Web Standards
Reviews of Designing with Web Standards
 
寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計
 
做自己的可可豆夾 @ cocoahead.tw
做自己的可可豆夾 @ cocoahead.tw做自己的可可豆夾 @ cocoahead.tw
做自己的可可豆夾 @ cocoahead.tw
 
淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践淘宝网前台应用性能优化实践
淘宝网前台应用性能优化实践
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild
 
石玉磊 Web rebuild
石玉磊 Web rebuild石玉磊 Web rebuild
石玉磊 Web rebuild
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits Level
 
Nginx深度開發與客制化
Nginx深度開發與客制化Nginx深度開發與客制化
Nginx深度開發與客制化
 
Debug Your Kubernetes Network
Debug Your Kubernetes NetworkDebug Your Kubernetes Network
Debug Your Kubernetes Network
 
[students AI workshop] Pytorch
[students AI workshop]  Pytorch[students AI workshop]  Pytorch
[students AI workshop] Pytorch
 
从开发到上线-实战持续交付
从开发到上线-实战持续交付从开发到上线-实战持续交付
从开发到上线-实战持续交付
 
開發工具與環境建置
開發工具與環境建置開發工具與環境建置
開發工具與環境建置
 

More from LI Daobing

好东西是聪明人下苦功夫做出来的
好东西是聪明人下苦功夫做出来的好东西是聪明人下苦功夫做出来的
好东西是聪明人下苦功夫做出来的LI Daobing
 
云存储: 三分开发,七分运维
云存储: 三分开发,七分运维云存储: 三分开发,七分运维
云存储: 三分开发,七分运维LI Daobing
 
分布式存储的元数据设计
分布式存储的元数据设计分布式存储的元数据设计
分布式存储的元数据设计LI Daobing
 
高可用和可伸缩架构
高可用和可伸缩架构高可用和可伸缩架构
高可用和可伸缩架构LI Daobing
 
短视频和云存储
短视频和云存储短视频和云存储
短视频和云存储LI Daobing
 
如何实现登出按钮
如何实现登出按钮如何实现登出按钮
如何实现登出按钮LI Daobing
 
重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务LI Daobing
 
HTTP协议相关的若干安全问题
HTTP协议相关的若干安全问题HTTP协议相关的若干安全问题
HTTP协议相关的若干安全问题LI Daobing
 
Debian & Packaging
Debian & PackagingDebian & Packaging
Debian & PackagingLI Daobing
 
OAuth: How And Why?
OAuth: How And Why?OAuth: How And Why?
OAuth: How And Why?LI Daobing
 
如何学习Bash Shell
如何学习Bash Shell如何学习Bash Shell
如何学习Bash ShellLI Daobing
 
glusterfs 文件系统
glusterfs 文件系统glusterfs 文件系统
glusterfs 文件系统LI Daobing
 

More from LI Daobing (13)

好东西是聪明人下苦功夫做出来的
好东西是聪明人下苦功夫做出来的好东西是聪明人下苦功夫做出来的
好东西是聪明人下苦功夫做出来的
 
云存储: 三分开发,七分运维
云存储: 三分开发,七分运维云存储: 三分开发,七分运维
云存储: 三分开发,七分运维
 
分布式存储的元数据设计
分布式存储的元数据设计分布式存储的元数据设计
分布式存储的元数据设计
 
高可用和可伸缩架构
高可用和可伸缩架构高可用和可伸缩架构
高可用和可伸缩架构
 
短视频和云存储
短视频和云存储短视频和云存储
短视频和云存储
 
如何实现登出按钮
如何实现登出按钮如何实现登出按钮
如何实现登出按钮
 
重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务重整工具箱-从开源软件到开放服务
重整工具箱-从开源软件到开放服务
 
HTTP协议相关的若干安全问题
HTTP协议相关的若干安全问题HTTP协议相关的若干安全问题
HTTP协议相关的若干安全问题
 
Debian & Packaging
Debian & PackagingDebian & Packaging
Debian & Packaging
 
OAuth: How And Why?
OAuth: How And Why?OAuth: How And Why?
OAuth: How And Why?
 
Git 简介
Git 简介Git 简介
Git 简介
 
如何学习Bash Shell
如何学习Bash Shell如何学习Bash Shell
如何学习Bash Shell
 
glusterfs 文件系统
glusterfs 文件系统glusterfs 文件系统
glusterfs 文件系统
 

出了问题不要靠猜