web架构单机时代

web架构单机时代


一、单机性能优化基础

  • 1)用户浏览器发送请求经过网络到达web服务器

  • 2)web服务器处理请求并响应数据

  • 3)响应数据从web服务器发送到用户端

  • 4)用户浏览器接收数据,本地计算和渲染

范例:

用户请求的时间消耗?

  • 如何缩短处理时间?

    • 方法:
      • 1)单机性能优化
      • 2)使用集群
      • 3)使用缓存
      • 4)瓶颈点优化
      • 5)多机房部署,就近访问
  • 流程:

    • 单机时代–>系统集群–>文件存储–>缓存应用–>数据存储–>异地灾备

单机时代架构图–单机

单机时代架构图–动静分离

单机时代架构图–数据库分离

单机时代架构图–组件分离

  • 什么是Sockit?(优化优选:Socket套接字受资源限制)

    • Socket五元组
      • 1:源地址
      • 2:源端口
      • 3:目的IP地址
      • 4:目的端口
      • 5:类型:TCP/UDP
    • TCP Socket四元组
      • 1:源IP地址
      • 2:源端口
      • 3:目的IP地址
      • 4:目的端口
  • 吞吐率

  • 响应时间

二、Socket基础和TCP三次握手

查看客户端请求服务端服务的随机端口范围

1
2
3
4
5
6
7
8
9
10
查看默认的随机端口范围

~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999

自定义优化随机端口范围

~]# echo "10000 61000" > /proc/sys/net/ipv4/ip_local_port_range
~]# cat /proc/sys/net/ipv4/ip_local_port_range
10000 61000

调整可以打开的最大文件描述符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
默认的打开最大文件

~]# ulimit -n
1024

~]# vim /etc/security/limits.conf

* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000

~]# reboot
~]# ulimit -n
1000000

使用ab命令对apache性能进行测试

1
2
3
4
5
6
7
安装ab命令压力测试工具

~]# yum install httpd-devel -y

ab 命令参数解释
-n : 指定总共发起的并发
-c : 每次并发

nc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源地址>][-v...][-w<超时秒数>][主机名称][通信端口...]
补充说明:执行本指令可设置路由器的相关参数。
参  数:
-g<网关> 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源地址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。

服务端指定一个端口监控

~]# nc -l -4 -p 9999 -k

客户端创建一个套接字链接服务端

~]# nc 172.20.101.228 9999 #指定服务端的IP地址记忆监听的端口
haha

服务端也收到客户端发送来的消息

~]# nc -l -4 -p 9999 -k
haha

服务端查看Socket (可以查看到四源组)

~]# netstat -na | grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN
tcp 0 0 192.168.35.115:9999 172.20.101.221:54594 ESTABLISHED

客户端以伪终端的方式向服务端监听的套接字发送信息(伪设备)

~]# echo "hellow" > /dev/tcp/172.20.101.228/9999

服务端接收到客户端的消息

~]# nc -l -4 -p 9999 -k
hellow

TCP状态转换图

三、Time_wait优化

time_wait优化的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1为开启,0为关闭

复用socekt链接

~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
0

时间戳

~]# cat /proc/sys/net/ipv4/tcp_timestamps
1

# tcp_tw_reuse 建议开启,但是前提时tcp_timestamps 已经打开


快速销毁socket,不等60s(快速回收)

~]# cat /proc/sys/net/ipv4/tcp_tw_recycle
0 #建议打开,但是用户的网络为NAT网络时则不建议打开

四、HTTP长连接和短链接

  • 1:HTTP协议与TCP/IP协议的关系

    • HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
  • 2:如何理解HTTP协议是无状态的

    • HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
  • 3:什么是长连接、短连接?

    • 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
    • 而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
      • Connection:keep-alive
    • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
    • HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
  • 3.1: TCP连接

    • 当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接。连接的建立依靠“三次握手”,而释放则需要“四次握手”,所以每个连接的建立都是需要资源消耗和时间消耗的。

经典的三次握手建立连接示意图:

经典的四次握手关闭连接示意图:

  • 3.2. TCP短连接

    • 模拟一下TCP短连接的情况:client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次请求就完成了。这时候双方任意都可以发起close操作,不过一般都是client先发起close操作。上述可知,短连接一般只会在 client/server间传递一次请求操作。

    • 短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。

  • 3.3. TCP长连接

    • 我们再模拟一下长连接的情况:client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

    • TCP的保活功能主要为服务器应用提供。如果客户端已经消失而连接未断开,则会使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的连接。

    • 如果一个给定的连接在两小时内没有任何动作,服务器就向客户发送一个探测报文段,根据客户端主机响应探测4个客户端状态:

    • 客户主机依然正常运行,且服务器可达。此时客户的TCP响应正常,服务器将保活定时器复位。

    • 客户主机已经崩溃,并且关闭或者正在重新启动。上述情况下客户端都不能响应TCP。服务端将无法收到客户端对探测的响应。服务器总共发送10个这样的探测,每个间隔75秒。若服务器没有收到任何一个响应,它就认为客户端已经关闭并终止连接。
    • 客户端崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
    • 客户机正常运行,但是服务器不可达。这种情况与第二种状态类似。
  • 4: 长连接和短连接的优点和缺点

    • 由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户端适合使用长连接。在长连接的应用场景下,client端一般不会主动关闭连接,当client与server之间的连接一直不关闭,随着客户端连接越来越多,server会保持过多连接。这时候server端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务。

    • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。

    • 长连接和短连接的产生在于client和server采取的关闭策略。不同的应用场景适合采用不同的策略。

    • 由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

    • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

    • 长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

  • 长连接短连接操作过程

    • 短连接的操作步骤是:
      • 建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
  • 长连接的操作步骤是:
    • 建立连接——数据传输…(保持连接)…数据传输——关闭连接
  • 什么时候用长连接,短连接?   

    • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

    • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

五、运维知识体系

  • 安装
    • 包管理工具:yum、apt-get
    • 编译安装:./configure –prefix=/path/xxx
    • 二进制安装
  • 配置
    • 网络
    • 路径
    • 容量
    • 性能
    • 安装
    • 功能
    • 日志
  • 启动
    • systemctl
    • ./执行
    • nohup/screen
  • 管理
-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%