当你在浏览器敲下一行网址:http://www.xxx.com/index.php,回车的时候,发生了什么?
1.键盘产生了一个电平信号,产生一个 CPU 中断
2.CPU 执行 OS 提供的键盘驱动程序读取键盘输入的字符
3.OS 发送键盘字符消息给浏览器程序
4.浏览器程序会获取网址输入框的内容,分析格式,如果是网址,则查询本机 DNS 缓存,如果没有命中则根据 OS 里面的 DNS SERVER 设置去查询域名的 A 记录对应的IP。
5.发送 HTTP GET 请求到服务器 IP ,如果没有指定端口,则默认请求 80 端口。
6.服务端收到请求后,判断请求的格式,如果是 .php 格式的,则根据 FASTCGI 协议,请求 PHP 进程监听的端口,如果是静态文件,则直接从硬盘读出(一般会缓存起来)。
7.PHP 进程在收到前端 nginx 请求的时候,有可能去请求 mysql 服务器,所以在 mysql 眼中,php 是前端。前端后端是相对的概念。
8.mysql 会分析 PHP 递送过来的 SQL 语句,去决定如何读取数据,是读索引还是表数据、缓存取决于很多因素:表结构,索引列和顺序,表的记录函数等等。
9.mysql 返回数据给 PHP,PHP 继续分析和执行脚本,这里开启了APC,则类似于 JVM 虚拟机,执行 PHP OPCODE
10.php 根据 FASTCGI 协议返回给 nginx
11.nginx 返回数据服务器 OS
12.服务器 OS 将返回的数据通过网卡发送给路由器
13.路由器根据路由表一站一站的转发到客户端的网卡手中
14.客户端网卡在收到数据后产生 CPU 中断,OS 调用网卡驱动程序读取数据,交给浏览器
15.浏览器根据返回的数据,如果资源都准备完毕,就立刻渲染。如果还缺少就继续请求,或者渲染一截出来。
以上每一个环节都有可能导致性能问题,但是常见的性能问题:
1.大网之间的延迟:
电信和联通
国内和国外
偏远地区到核心骨干
2.域名解析延迟:
如果 ns server 放在国外,那么在第一次解析的时候肯定会有慢一点,但是还好有 DNS 有缓存,一般可以忽略
3.硬件资源:
CPU颗数、频率
内存大小、外频
硬盘读写速度、接口、SATA
4.软件优化:
Linux优化
nginx优化
php优化
mysql优化
5.系统架构:
资源动静分离,CDN
6.程序:
网络IO,磁盘IO相关函数的调用优化
MySQL索引优化