性能监控分析
服务器性能监控与分析
一、通过vmstat深挖服务器性能问题(获取服务器资源的监控数据)
vmstat
命令的基本语法如下:
vmstat [options] [delay [count]]
options
:可选参数,用于指定要显示的信息类型和格式。delay
:可选参数,指定两次报告之间的时间间隔(以秒为单位)。count
:可选参数,指定要显示的报告数量。
一些常用的 vmstat
选项包括:
-a
:显示活跃和非活跃内存。-f
:显示从系统启动至今的fork数量,包括fork、vfork和clone。-m
:显示slabinfo信息,即内核缓存信息。-n
:在首次输出后,不重新显示标题。-s
:显示各种事件计数器和内存统计信息。-d
:显示磁盘统计信息。-p
:显示特定分区的详细I/O统计信息。
vmstat
的输出通常包括以下列:
procs
:进程信息,包括运行队列中的进程(r)和等待I/O的进程(b)。memory
:内存使用情况,包括空闲内存(free)、缓冲区(buff)和缓存(cache)。swap
:交换空间使用情况,包括空闲交换空间(free)和使用的交换空间(si,so)。io
:磁盘I/O信息,包括块设备读写(bi,bo)。system
:系统信息,包括中断(in)和上下文切换(cs)。cpu
:CPU使用情况,包括用户时间(us)、系统时间(sy)、空闲时间(id)、等待I/O时间(wa)、硬中断时间(hi)和软中断时间(si)。
例如,要每秒显示一次系统状态,可以使用以下命令:
vmstat 1
要显示5次报告,每次间隔2秒,可以使用:
vmstat 2 5
vmstat输出范例如下
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 1 256 123456 23456 765432 0 0 10 20 100 200 5 3 85 7 0
0 0 256 123456 23456 765432 0 0 5 15 1000 2000 5 3 85 7 0
1 0 256 123456 23456 765432 0 0 10 25 100 200 5 3 85 7 0
各列的含义如下:
r
:等待运行的进程数。如果发现这个数据超过了服务器的cpu的核数,就有可能出现cpu瓶颈(在判断时需要结合cpu使用的百分比来一起来看,也就是最后5列的数据指标)b
:处于不可中断睡眠状态的进程数。(系统等待资源而阻塞运行的指令个数,比如因为等待i/o、内存交换、cpu等资源而早成的阻塞。如果改数值过高,就需要检查服务器上i/o\内存、cpu等资源是不是出现了瓶颈)swpd
:使用的虚拟内存大小。(swpd指服务器的无力内存不够用时,会把无服务物理内存中部空间释放出来,以供急需物理内存来运行的程序使用,而哪些物理内存释放出来的内容一般是一些长时间内有实际运行的程序,这些程序内容就黑保存到swpd中,等这些程序需要运行时再从swpd恢复到物理内存中。swpd一般使用都是磁盘的空间,而磁盘的i/o读写一般会比物理内存慢。如果存在大量的swpd读写交换,将会影响程序运行的性能。swpd的数值大于0并不表示服务器的无力内存不够用需要结合si和so的指标来一起分析,如果si和so还维持在0,那么服务器的无力内存还是够用的
)free
:空闲内存大小。(free的值是不包含buff和cache这两列数值在内的
)buff
:用作缓冲区的内存大小。(单位k,,一般对块设备的读写才需要缓冲区,一般内存很大的服务器,这个值比较大,操作系统会根据服务器的无力内存去调整缓冲区使用内存的大小,以提高读写的速度)cache
:用作缓存的内存大小。(表示用来给已经打开文件作为缓存的内存大小,cache直接用来缓存我们打开的文件,把空闲的物理内存的一部分哪来用做文件和目录的缓存,这是为了提高程序的执行性能,当程序使用内存时,buff/cache会被很快使用;当空闲的物理内存不足时,这些缓存的占用的内存就会被释放出来
)si
:从磁盘交换到内存的数据量(每秒的千字节数)。(每秒从磁盘(虚拟内存swpd
)读入到内存中的数据或内容的大小,如果这个值长期大于0,表示物理内存可能已经不够用了)so
:从内存交换到磁盘的数据量(每秒的千字节数)(每秒从物理内存写入磁盘(虚拟内存swpd
)的数据或内容大小,so刚好和si相反,so是将磁盘空间调入内存,si是将内存数据写入磁盘)。bi
:从块设备接收的块数(读取,每秒的块数)(表示数据块block设备每秒读取的块数量【从磁盘读取数据,这个值一般表示每秒读取了磁盘的多少个block】,这里的块设备是指系统上所有的磁盘和其他块设备,默认块的大小是1024字节)。bo
:发送到块设备的块数(写入,每秒的块数)。(表示数据块block设备每秒写入的块数量【从磁盘写入数据,这个值一般表示有多少个block写入磁盘】,在随机磁盘读写时,bi和bo这两个值越大(如超出了1024k),cpu在i/o的等待的值也会变大)in
:每秒的中断数,包括时钟中断。cs
:每秒的上下文切换次数。(列如我们调用系统函数,就会导致系统上下文切换、包括线程的切换和进程的上下文切换,这个值越小越好,太大了要考虑调低线程或进程的数量;列如:在apache或nginx这汇总web服务器 中到底配置多少个线程和进程的数量呢?一般做性能压测时会进行几千甚至几万的并发调用,配置web服务器的进程数可以有进程或者线程的峰值一直慢慢下调,都知道性能压测时发现cs到一个比较小的值,这个进程和线程数就是一个比较合适的值了,系统调用也是,每次调用系统函数,我们的代码会就如内核空间,导致上下文切换,这个很耗资源,也要尽量避免频繁调用系统函数,上下文切换次数过多表示cpu大部分运行实践朗威在上下文切换操作还是那个了,导致cpu干正经事的时间少了,cpu没有充分利用。如果观察到in和cs这两个指标非常高,那就需要对系统进行性能调优了)us
:用户CPU时间。(用户模式使用cpu的百分比,这个数值越高说明cpu被正常利用的越好)sy
:系统CPU时间。(系统内核进程执行时间的百分比,sy的值高说明系统内核消耗的cpu资源越多,这并不是服务器性能好的表现,通常in、cs、i/o的频繁操作,都会引起sy的指标过高)id
:空闲CPU时间。(cpu空闲时间的占比,一般来说id+us+sy=100,通常可以认为id是空闲cpu使用率,us是用户cpu使用率,sy是系统cpu使用率)wa
:等待I/O的CPU时间。(i/o等待时间百分比,wa值比较高说明i/o等到比较严重 随机访问说造成,也可能是磁盘出现瓶颈【块操作非常频繁】)st
:被虚拟机偷走的CPU时间(在物理机中,该值一般维持为0;一般一台物理机上有很多台虚拟机,st就是等待时间占cpu时间的占比,如果该值一直持续很高,表示虚拟服务需要等待cpu,运行在改服务器上的引用程序的性能会收到直接影响)。
二、通过mpstat分析服务器的性能指标(监控服务器整体性能指标)
mpstat
是一个用于报告每个处理器的统计信息的命令行工具,它通常用于多处理器系统中,可以显示每个CPU的性能指标。mpstat
是 sysstat
包的一部分,该包还包括其他一些有用的性能监控工具,如 sar
、iostat
和 pidstat
。
mpstat
命令的基本语法如下:
mpstat [options] [interval [count]]
options
:可选参数,用于指定要显示的信息类型和格式。interval
:可选参数,指定两次报告之间的时间间隔(以秒为单位)。count
:可选参数,指定要显示的报告数量。
一些常用的 mpstat
选项包括:
-P ALL
:显示所有处理器的统计信息。-P {cpu_number}
:显示特定处理器的统计信息,其中{cpu_number}
是处理器编号(从0开始)。
mpstat
的输出通常包括以下列:
CPU
:处理器编号。%usr
:用户模式下CPU使用率。和vmstat中us的数据基本一致%nice
:具有nice优先级的用户模式下CPU使用率。%sys
:系统模式下CPU使用率。(该值越高,说明系统内核消耗的cpu资源局越多和vmstat中的sy数据已基本一致)%iowait
:等待I/O完成时CPU空闲的时间百分比。(该值越高就说明i/o等待月严重和vmstat中的wa的数据基本一致)%irq
:用于处理硬件中断的CPU时间百分比。(和vmstat中的in基本一致,in越高,一般%irq也会越高
)%soft
:用于处理软件中断的CPU时间百分比。%steal
:在虚拟化环境中,被其他虚拟CPU偷走的时间百分比。(和vmstat中的st基本一致)%guest
:运行虚拟CPU的时间百分比。%idle
:CPU空闲时间百分比。(和vmstat中的id基本一致)
例如,要每秒显示一次所有处理器的统计信息,可以使用以下命令:
mpstat 1
要显示特定处理器(例如,处理器0)的统计信息,可以使用:
mpstat -P 0 1
要显示所有处理器的统计信息,每次间隔2秒,共显示5次,可以使用:
mpstat -P ALL 2 5
输出范例
Linux 4.15.0-54-generic (ubuntu) 05/07/2023 _x86_64_ (8 CPU)
07:35:01 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:35:01 PM all 5.10 0.00 2.20 0.75 0.00 0.15 0.00 0.00 0.00 91.80
07:35:01 PM 0 6.10 0.00 3.10 1.20 0.00 0.30 0.00 0.00 0.00 89.30
07:35:01 PM 1 4.80 0.00 1.90 0.50 0.00 0.10 0.00 0.00 0.00 92.70
07:35:01 PM 2 5.60 0.00 2.50 0.80 0.00 0.20 0.00 0.00 0.00 90.90
07:35:01 PM 3 5.00 0.00 2.10 0.70 0.00 0.10 0.00 0.00 0.00 92.10
07:35:01 PM 4 4.90 0.00 1.80 0.60 0.00 0.00 0.00 0.00 0.00 92.70
07:35:01 PM 5 5.20 0.00 2.30 0.90 0.00 0.10 0.00 0.00 0.00 91.50
07:35:01 PM 6 5.30 0.00 2.40 0.85 0.00 0.25 0.00 0.00 0.00 91.20
07:35:01 PM 7 5.10 0.00 2.20 0.75 0.00 0.15 0.00 0.00 0.00 91.80
三、通过pidstat发现性能问题(针对系统中某个金长城进行资源监控)
下面是一些常用的 pidstat
选项:
-h
:显示帮助信息。-u
:显示CPU使用情况。-r
:显示内存使用情况。-d
:显示磁盘I/O使用情况。-s
:显示堆栈使用情况 (仅限于某些版本)。-v
:显示虚拟内存使用情况。-w
:显示任务切换统计信息。-l
:显示命令名称和所有参数。-p {pid}
:监视指定PID的进程
使用示例
查看所有进程的CPU使用情况
pidstat -u
显示特定进程的资源使用情况
pidstat -urd -p <PID>
按间隔和次数显示进程信息
pidstat 5 3
输出范例
Linux 4.15.0-54-generic (ubuntu) 05/07/2023 _x86_64_ (8 CPU)
07:40:01 PM UID PID %usr %system %guest %wait %CPU CPU Command
07:40:01 PM 0 1234 0.00 0.20 0.00 0.00 0.20 2 nginx
07:40:01 PM 0 2345 0.10 0.10 0.00 0.00 0.20 3 sshd
07:40:01 PM 0 3456 0.00 0.00 0.00 0.00 0.00 1 bash
07:40:01 PM 0 4567 0.00 0.00 0.00 0.00 0.00 0 pidstat
07:40:01 PM 0 5678 0.00 0.00 0.00 0.00 0.00 7 cron
07:40:01 PM 0 6789 0.00 0.00 0.00 0.00 0.00 6 syslogd
07:40:01 PM 0 7890 0.00 0.00 0.00 0.00 0.00 5 kswapd0
07:40:01 PM 0 8901 0.00 0.00 0.00 0.00 0.00 4 kjournald
07:40:01 PM 0 9012 0.00 0.00 0.00 0.00 0.00 3 ksoftirqd/0
07:40:01 PM 0 9123 0.00 0.00 0.00 0.00 0.00 2 ksoftirqd/1
在这个输出中,每一行代表一个进程的统计信息:
UID
:进程所有者的用户ID。PID
:进程ID。%usr
:用户模式下CPU使用百分比。%system
:系统模式下CPU使用百分比。%guest
:运行虚拟机时CPU使用百分比。%wait
:进程等待CPU时间百分比。%CPU
:总的CPU使用百分比。CPU
:处理该进程的CPU编号。Command
:进程对应的命令名。
四、losf命令(列出当前系统打开了哪些文件,系统中某个进程打开了哪些文件等信息)
losf命令必须运行在root用户下。
lsof
(List Open Files)是一个用来列出当前系统打开文件的工具。在Linux系统中,一切皆文件,因此 lsof
不仅能够列出常规的文件,还能列出网络连接、设备、管道等。lsof
对于系统管理员和开发人员来说是一个非常有用的工具,尤其是在诊断系统问题、查看进程打开的文件、检查网络连接等方面。
常用选项
下面是一些常用的 lsof
选项:
-i
:列出所有网络连接。-p <PID>
:列出指定进程ID打开的文件。-u <username>
:列出指定用户打开的文件。-c <command>
:列出指定命令打开的文件。-d <fd>
:列出指定文件描述符的文件。+D <directory>
:递归列出指定目录下被打开的文件。-t
:只输出进程ID,不输出其他信息,常用于脚本中。
使用示例
列出所有网络连接
lsof -i
这将显示系统中所有打开的网络连接。
列出特定端口的网络连接
lsof -i :80
这个命令将显示所有使用80端口的网络连接。
列出特定进程打开的文件
lsof -p 1234
这将显示PID为1234的进程打开的所有文件。
列出特定用户打开的文件
lsof -u root
这将显示用户名为root的用户打开的所有文件。
列出特定命令打开的文件
lsof -c sshd
这将显示命令名为sshd的进程打开的所有文件。
五、free看懂内存的真实使用
free
是一个用于显示系统内存使用情况的命令行工具。它提供了关于系统物理内存和交换空间(swap space)的使用信息,包括已用内存、空闲内存、缓冲区和缓存等。free
命令对于监控系统内存使用情况和诊断内存相关问题非常有用。
下面是一些常用的 free
选项:
-h
:以人类可读的格式(例如,使用GB、MB而不是字节)显示内存大小。-m
:以MB为单位显示内存大小。-g
:以GB为单位显示内存大小。-t
:显示总计行,包括物理内存和交换空间的总和。-s <秒数>
:持续监视内存使用情况,每隔指定的秒数刷新一次输出。-c <次数>
:在退出前显示指定次数的内存使用情况。
显示内存使用情况
free
这将显示系统的内存使用情况,包括物理内存和交换空间。
以人类可读的格式显示内存使用情况
free -h
这个命令将以GB或MB为单位显示内存大小,使得输出更加易读。
持续监视内存使用情况
free -s 5
这将每5秒刷新一次内存使用情况的输出。
显示内存使用情况的总计行
free -t
这个命令将在输出的最后一行显示物理内存和交换空间的总和。
free
命令的输出通常包括以下几列:
total
:系统总的物理内存或交换空间大小。Kused
:已使用的内存或交换空间大小。Kfree
:空闲的内存或交换空间大小。Kshared
:被多个进程共享的内存大小。Kbuff/cache
:被内核缓冲区或文件系统缓存占用的内存大小。K(buff在操作系统中指的缓冲区,负责磁盘块设备的读写缓冲,会直接占用系统的物理内存;cache指操作系统中page缓存,这个缓存linux内核实现磁盘缓存,就是将磁盘中的数据缓冲到物理内存中,以减少i/o读写操作这样磁盘的访问的编委对物理内存的访问,从而提高系统对磁盘的读写速度
)available
:可用于启动新应用程序的内存大小,通常比free
列的值要大,因为它还包括了可以被回收的缓存和缓冲区。K(通常available=free+buff/cache
)
六、通过top发现问题(定位服务器消耗的问题)
基本用法
直接在终端中输入 top
并回车,即可启动实时的系统监控界面。
主要显示区域
- 系统概况区:显示系统运行时间、登录用户数、系统负载等信息。
- 任务概况区:显示当前进程的总数、运行的进程数、休眠的进程数、已停止的进程数和僵尸进程数。
- CPU 概况区:显示 CPU 使用情况,包括用户空间占用比例、系统空间占用比例、空闲比例等。
- 内存概况区:显示物理内存和交换空间的使用情况。
常用操作和选项
- 排序进程:在
top
运行时,按<字段标识符>
(例如,M
用于按内存使用量排序,P
用于按 CPU 使用率排序)对进程列表进行排序。 - 查找进程:在
top
运行时,按L
进入搜索模式,可以根据进程名查找进程。 - 杀死进程:在
top
运行时,按k
,然后输入想要结束的进程 ID(PID)和信号(通常是 9),可以杀死进程。 - 更新频率:启动
top
命令时,可以通过-d <秒数>
参数设置屏幕刷新的时间间隔。
示例命令
启动
top
并设置更新间隔为 2 秒:top -d 2
显示特定用户的进程:
top -u <用户名>
七、网络流量如何监控iftop
iftop不是系统自带命令需要下载安装
下载完成后执行./configure命令进行安装前的自动安装配置检查
配置安装检查通过后,执行make&&make install命令对源码进行编译然后再 进行安装
安装完成后,你可以通过在终端中输入 iftop
来启动它。通常,你需要使用 root 权限来运行 iftop
,因为它需要读取网络接口的数据。
sudo iftop
常用选项
-i <interface>
:指定要监控的网络接口。-B
:以字节为单位显示流量(默认以比特为单位)。-n
:直接显示 IP 地址,不进行 DNS 解析。-N
:显示端口号而不是服务名称。-P
:显示端口和主机信息。-F <ip>
:监控特定的 IP 网络。
示例
监控 eth0 接口:
sudo iftop -i eth0
以字节为单位显示流量,不进行 DNS 解析:
sudo iftop -B -n
显示端口和主机信息:
sudo iftop -P
界面说明
iftop
的界面通常分为几个部分:
- 顶部:显示当前的带宽使用情况,包括峰值、平均值和当前值。
- 中间:列出当前的网络连接,包括本地和远程 IP 地址、端口号、流量方向和带宽使用情况。
- 底部:提供一些快捷键,如切换排序方式、显示帮助信息等
八、nmon对服务器的真题性能监控
安装完成后,只需在终端输入 nmon
命令即可启动。启动nmon
后,它会以一个交互式界面显示系统状态。
主要功能
- 实时监控:在交互式界面中,实时显示系统各项性能指标。
- 数据捕获:可以将监控数据保存到一个文件中,稍后可以使用其他工具进行分析。
- 多重显示:可以同时监控CPU、内存、磁盘和网络的性能。
常用命令键
在运行 nmon
的过程中,可以使用以下按键激活不同的监控视图:
- c:显示CPU使用情况。
- m:显示内存使用情况。
- d:显示磁盘I/O信息。
- k:显示内核信息和运行队列。
- n:显示网络信息。
- V:显示虚拟内存统计。
- r:显示资源限制。
web中间件的性能分析与调优
nginx的性能分析与调优
nginx负载均衡策略的介绍与调优
负载均衡策略
Nginx 支持多种负载均衡方法,以下是一些主要的策略:
- 轮询(Round Robin):默认的负载均衡方法,按顺序把请求分配给每个服务器,如果服务器宕机,则自动剔除故障机器。
- 最少连接(Least Connections):把请求发送到连接数最少的服务器,适用于处理时间不等的请求。
- IP哈希(IP Hash):根据客户端的 IP 地址进行哈希计算,然后分配给一个固定的后端服务器,这种方式可以确保来自同一客户端的请求总是发到同一服务器,常用于会话保持。
- 权重(Weighted):与轮询结合使用,给不同的服务器分配不同的权重,根据权重比例分配请求,权重高的服务器承担更多的请求。
- Generic hash:自定义键值(比如URL或者头部)来分配请求,更加灵活。
- 随机(Random):可以选择带权重的或不带权重的随机分配方法。
配置实例
http {
upstream backend {
least_conn; # 使用最少连接数负载均衡策略
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com weight=5;
keepalive 32; # 后端连接的keepalive数
}
server {
listen 80;
server_name your_domain.com;
# SSL 配置
listen 443 ssl;
ssl_certificate /path/to/your_certificate.pem;
ssl_certificate_key /path/to/your_private_key.key;
ssl_session_cache shared:SSL:10m; # SSL会话缓存
ssl_session_timeout 10m; # SSL会话超时时间
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection ""; # 启用连接复用
proxy_buffering on;
proxy_cache my_cache; # 启用缓存
proxy_cache_valid 200 1d; # 200响应缓存1天
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 超时设置
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
# 缓存路径配置
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
# 安全加固
server_tokens off; # 不显示nginx版本号
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
}
解释
- upstream配置:使用了最少连接数 (
least_conn
) 负载均衡策略,并且为后端服务器设置了不同的权重,并启用了连接复用。 - SSL配置:提供了SSL证书的配置,启用了SSL会话缓存,减少了SSL握手时间。
- proxy设置:设置了一系列的
proxy_set_header
指令,确保后端服务器可以接收到正确的HTTP头信息。启用了HTTP 1.1和连接复用来提高效率。启用并配置了缓存,以及定义了代理的超时设置。 - proxy_cache_path:指定了缓存的路径、大小、过期时间等。
- 安全加固:关闭了服务器版本号的显示,增加了几个安全相关的响应头,以增强应用的安全性。
nginx进程数的配置调优
Nginx 使用一个 master 进程和多个 worker 进程的架构模式。
master 进程主要负责读取和评估配置文件、管理 worker 进程等;而实际处理客户端请求的任务则是由 worker 进程完成的。合理配置 worker 进程的数量,可以让 Nginx 充分利用系统资源,提高并发处理能力。
master进程:可以控制nginx服务的启动、停止、重启、配置文件的重新加载
worker进程:处理用户请求信息,将收到的用户请求转发到后端的应用服务器上
worker进程的个数可以在配置文件nginx.conf中进行配置
events {
worker_connections 1024;
}
http {
worker_processes auto;
...
}
在这个配置中:
worker_processes
被设置为auto
,Nginx 将根据 CPU 核数自动决定 worker 进程数量。worker_connections
被设置为 1024,这意味着每个 worker 进程可以同时处理 1024 个连接。
调优建议
计算最大并发连接数:最大并发连接数应该是
worker_processes
和worker_connections
的乘积。服务器的最大并发连接能力应该与这个数值一致。考虑 Linux 系统的文件描述符限制:确保系统的文件描述符限制数(
ulimit -n
)足够高,至少要大于 Nginx 的worker_connections
值。如果文件描述符的数量太低,即使你在 Nginx 中设置了较高的worker_connections
,也无法打开更多的连接。使用多核优势:如果服务器有多个 CPU 核心,合理配置
worker_processes
可以让你充分利用多核的优势,提高并发处理能力。调整
multi_accept
和use
指令:在events
块中,可以设置multi_accept
为on
,使得每个 worker 在接受新连接时一次性接受多个连接。同样,use
指令可以设置事件模型(如epoll
),以适合你的系统。
nginx事件处理模型的分析与调优
ginx 是高性能的 HTTP 和反向代理服务器,它使用异步非阻塞事件驱动的方法来处理请求,这使得 Nginx 在处理高并发连接时非常高效。Nginx 支持多种事件处理模型,包括 select
, poll
, kqueue
, epoll
, /dev/poll
, eventport
等。不同的模型在不同的操作系统和服务器架构上表现也不同。
Nginx常用的事件处理模型:
epoll:
- 适用系统: Linux
- 描述: epoll 是 Linux 特有的高效 I/O 事件通知机制,特别适合处理大量并发连接。它是 Nginx 在 Linux 系统上默认使用的事件模型。
kqueue:
- 适用系统: FreeBSD, OpenBSD, NetBSD (以及 macOS,虽然 macOS 的实现有所不同)
- 描述: kqueue 是一个高性能的基于事件的通知接口,适用于高并发环境。在 BSD 系统中,它是 Nginx 的首选事件模型。
select:
- 适用系统: 跨平台,但效率较低
- 描述: select 是一个传统的 I/O 多路复用机制,但由于其性能限制(通常支持的文件描述符数量较少),在现代高并发服务器中使用较少。
poll:
- 适用系统: 跨平台
- 描述: poll 与 select 类似,但提供了更好的性能,尤其是在处理大量文件描述符时。然而,它仍然不如 epoll 或 kqueue 高效。
/dev/poll:
- 适用系统: Solaris, Unix
- 描述: /dev/poll 是 Solaris 和一些 Unix 系统上的高级 I/O 多路复用机制,提供了比 select 和 poll 更好的性能。
eventport:
- 适用系统: Solaris
- 描述: eventport 是 Solaris 10 及以上版本提供的事件处理机制,旨在解决 /dev/poll 的一些限制。
iocp:
- 适用系统: Windows
- 描述: iocp(Input/Output Completion Port)是 Windows 系统上的一个高效的异步 I/O 模型,Nginx 在 Windows 上使用此模型来处理事件。
调优事件模型
在 nginx.conf
文件的 events
块中,可以设置事件模型:
events {
use epoll; # 仅在 Linux 系统有效
worker_connections 1024; # 设置每个 worker 进程可以打开的最大连接数
multi_accept on; # 指示 worker 一次性接受所有新连接
}
调优事件处理模型的时候,要考虑以下几个方面:
选择合适的模型:默认情况下,Nginx 会选择适合当前系统的最佳事件模型。通常不需要手动设置,除非你确定某个模型在你的特定场景下更有效。
增加
worker_connections
:调整worker_connections
值来增加你的服务器可以处理的并发连接数。这个值应小于或等于系统的文件描述符限制。使用
multi_accept
:启用multi_accept
可以使得每个 worker 在一个操作中接受所有新连接,这在高流量时可以减少系统调用的次数。监控
worker_connections
使用情况:可以通过 Nginx 的状态模块或日志来监控worker_connections
的使用情况,以确保配置得当。调整
sendfile
,tcp_nopush
, 和tcp_nodelay
:这些设置不是直接关联到事件模型,但它们会影响 I/O 操作,从而影响性能。sendfile
开启高效文件传输,tcp_nopush
和tcp_nodelay
调整了 TCP 的行为以优化网络传输。优化 SSL:如果使用 SSL/TLS,考虑使用
ssl_session_cache
和ssl_session_tickets
来减少握手时的资源消耗。操作系统调整:确保操作系统层面的设置,如
file descriptors limit
(文件描述符限制)和tcp_fin_timeout
(TCP FIN超时)等,与 Nginx 的设置相匹配。
nginx中文件传输的性能优化
在 Nginx 中,文件传输的性能优化通常涉及以下几个关键参数和指令(通常在nginx.conf文件中修改):
1. **`sendfile`**:
- 描述: 启用或禁用使用 `sendfile()` 系统调用来传输文件。`sendfile` 允许数据从文件系统直接传输到网络套接字,减少了数据在内核空间和用户空间之间的复制。(默认是sendfile off)
- 配置示例:
sendfile on;
2. **`tcp_nopush`**:
- 描述: 启用或禁用 TCP_NOPUSH(或 TCP_CORK)选项,这通常与 `sendfile` 一起使用。当设置为 `on` 时,Nginx 会等待完整的 HTTP 响应头和数据块一起发送,这可以提高网络效率。(默认是tcp_nopush off)
- 配置示例:
tcp_nopush on;
3. **`tcp_nodelay`**:
- 描述: 启用或禁用 TCP_NODELAY 选项,这会影响 Nagle 算法。当设置为 `on` 时,Nginx 会立即发送小数据包,减少延迟,适合于实时性要求高的应用。(默认是tcp_nopush on)
- 配置示例:
tcp_nodelay off;
4. **`output_buffers`**:
- 描述: 设置从磁盘读取响应时的缓冲区大小。合理设置可以减少磁盘 I/O 操作。
- 配置示例:
output_buffers 1 128k;
5. **`sendfile_max_chunk`**:
- 描述: 限制每个 `sendfile` 调用传输的最大数据块大小。这可以防止单个文件传输占用过多的工作进程资源。
- 配置示例:
sendfile_max_chunk 2m;
6. **`gzip`**:
- 描述: 启用或禁用 Gzip 压缩。压缩可以减少传输的数据量,但会增加服务器和客户端的 CPU 使用。
- 配置示例:
gzip on;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript;
7. **`expires`**:
- 描述: 设置缓存控制头,允许客户端缓存静态资源。这可以减少对相同资源的重复请求。
- 配置示例:
location ~* \.(jpg|jpeg|gif|png|css|js)$ {
expires 30d;
}
8. **`ssl_session_cache` 和 `ssl_session_timeout`**:
- 描述: 配置 SSL 会话缓存和超时时间,以减少 SSL/TLS 握手的开销。
- 配置示例:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
9. **`keepalive_timeout`**:
- 描述: 设置与客户端的持久连接超时时间。持久连接可以减少每次请求时的握手开销。
- 配置示例:
keepalive_timeout 65;
10. **`keepalive_requests`**:
- 描述: 设置单个持久连接上允许的最大请求数。
- 配置示例:
keepalive_requests 100;
这些参数和指令可以根据具体的应用场景和性能需求进行调整。通常,最佳实践是在实际环境中进行测试,以确定哪些设置最适合你的特定情况。
nginx中FastCGI配置的分析与调优
在 Nginx 中,通过 FastCGI 与后端的 PHP 或其他语言编写的应用程序进行通信。FastCGI 的配置和调优可以显著影响动态内容的性能。以下是一些关键的 FastCGI 参数和调优策略:
1. **`fastcgi_buffering`**:
- 描述: 控制 Nginx 是否缓冲 FastCGI 服务器发送的响应。在高负载时,启用缓冲可以减少后端服务器的负载。
- 配置示例:
fastcgi_buffering on;
2. **`fastcgi_buffers` 和 `fastcgi_buffer_size`**:
- 描述: 控制用于缓冲来自 FastCGI 服务器响应的内存区域的数量和大小。不当设置可能会导致缓冲区溢出或内存浪费。
- 配置示例:
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
3. **`fastcgi_connect_timeout`**:
- 描述: 设置与 FastCGI 服务器建立连接的超时时间。
- 配置示例:
fastcgi_connect_timeout 60s;
4. **`fastcgi_send_timeout` 和 `fastcgi_read_timeout`**:
- 描述: 设置发送请求到 FastCGI 服务器、读取响应的超时时间。在处理大型请求或响应时,可能需要增加这些值。
- 配置示例:
fastcgi_send_timeout 90s;
fastcgi_read_timeout 90s;
5. **`fastcgi_busy_buffers_size`**:
- 描述: 设置服务器忙时用于响应缓冲的内存大小。这应大于单个 `fastcgi_buffers` 的大小。
- 配置示例:
fastcgi_busy_buffers_size 24k;
6. **`fastcgi_temp_file_write_size`**:
- 描述: 设置写入临时文件的数据块大小。大数据块可以减少磁盘 I/O 操作。
- 配置示例:
fastcgi_temp_file_write_size 256k;
7. **`fastcgi_intercept_errors`**:
- 描述: 控制是否允许 Nginx 处理来自 FastCGI 服务器的错误响应。
- 配置示例:
fastcgi_intercept_errors on;
8. **`fastcgi_index`**:
- 描述: 设置 FastCGI 服务器的默认索引文件。
- 配置示例:
fastcgi_index index.php;
9. **`fastcgi_param`**:
- 描述: 设置传递给 FastCGI 服务器的参数,例如脚本文件名、查询字符串等。
- 配置示例:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
10. **`fastcgi_split_path_info`**:
- 描述: 设置正则表达式,用于解析 PATH_INFO 从请求 URI。
- 配置示例:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
11. **`fastcgi_cache` 和相关缓存指令**:
- 描述: 控制对 FastCGI 响应的缓存行为。使用 FastCGI 缓存可以显著提高性能,减少后端服务器的压力。
- 配置示例:
fastcgi_cache my_cache;
fastcgi_cache_valid 200 60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
进行 FastCGI 的配置和调优时,应该根据实际的应用负载和服务器资源来进行配置。通过观察服务器的性能指标(如CPU、内存使用率、响应时间等),逐步调整参数,并不断地进行测试和监测以找到最佳配置。
nginx的性能监控
Nginx 的性能监控是确保服务器稳定运行和优化性能的关键部分。以下是一些常用的工具和方法来监控 Nginx 的性能:
1. **Nginx 状态模块 (`ngx_http_stub_status_module`)**:
- 描述: 这是一个内置模块,提供基本的 Nginx 运行状态信息,如活跃连接数、处理中的请求数、请求处理速率等。
- 配置示例:
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.102;
deny all;
}
(allow 192.168.1.102;:代表允许访问监控页面的ip地址)
配置完成后通过执行nginx-sreload来重新加载配置信息
- 访问方法: 通过浏览器或命令行工具访问 `http://your_server_ip/nginx_status`。
2. **第三方监控工具**:
- **Nagios**: 一个广泛使用的开源监控系统,可以监控 Nginx 的状态和性能指标。
- **Zabbix**: 另一个功能强大的开源监控解决方案,支持自定义监控项和触发器。
- **Prometheus**: 一个开源的监控和警报工具集,通过 Nginx 的 Prometheus 导出器来收集指标。
- **Grafana**: 一个可视化工具,可以与 Prometheus 等后端集成,创建动态的监控仪表板。
3. **Nginx 的 Prometheus 导出器**:
- 描述: 这是一个第三方工具,可以将 Nginx 的运行时数据转换为 Prometheus 可抓取的格式。
- 安装和配置: 需要单独安装并配置,以便 Prometheus 可以定期抓取指标。
4. **Nginx Plus**:
- 描述: Nginx Plus 是 Nginx 的商业版本,提供了更全面的监控和分析功能,包括实时活动监控、请求处理图表等。
- 功能: 包括 API 监控、负载均衡监控、会话持久性监控等。
5. **日志分析**:
- 描述: 分析 Nginx 的访问日志和错误日志可以提供关于请求模式、错误率和性能瓶颈的洞察。
- 工具: 使用如 `awk`、`grep`、`logrotate` 等命令行工具,或更高级的日志分析工具如 ELK Stack(Elasticsearch, Logstash, Kibana)。
6. **性能测试工具**:
- **Apache JMeter**: 用于测试 Nginx 的负载和性能。
- **ab (Apache Benchmark)**: 一个简单的命令行工具,用于测试 Nginx 的性能。
- **wrk**: 一个现代的高性能基准测试工具。
7. **系统监控工具**:
- **top**, **htop**: 监控系统资源使用情况,如 CPU 和内存。
- **iostat**, **vmstat**: 监控磁盘和内存的性能。
- **netstat**: 监控网络连接和端口使用情况。
进行 Nginx 性能监控时,应关注的关键指标包括但不限于:
- 活跃连接数
- 请求处理速率
- 响应时间
- 错误率
- 系统资源使用情况(CPU、内存、磁盘 I/O、网络带宽)
通过这些工具和方法,可以有效地监控 Nginx 的性能,及时发现并解决潜在的问题,确保服务的稳定性和高效性。
apache的性能分析与调优
apache的工作模式选择和进程数调优
apache的工作模式主要是apache在运行时内存分配、cpu、进程以及线程的使用管理和请求任务的调度等。apache的工作模式选择和进程数调优比较稳定的工作模式有prefork模式、worker模式、event 模式;apache默认使用prefork模式,一般可以在编译安装apache时通过--with-mpm来制定安装后使用的工作模式,可以通过httpd -V命令来产看当前apache当前的使用的工作模式。
prefork MPM
- 特点:非线程化,每个请求由一个单独的进程处理。适用于不支持线程的环境或需要与其他不支持线程的模块(如 PHP)一起使用的情况。
- 优点:稳定,兼容性好。
- 缺点:资源消耗较大,不适合高并发环境。
worker MPM
- 特点:使用多个子进程,每个子进程包含多个线程。线程比进程轻量,可以处理更多的并发连接。
- 优点:资源利用率高,适合高并发环境。
- 缺点:需要支持线程的操作系统和库,可能存在线程安全问题。
event MPM
- 特点:类似于 worker,但包括一个特殊的线程来处理保持活动连接,即使在处理长连接时也能保持高性能。
- 优点:在处理大量并发连接时效率高,特别是在使用保持活动连接时。
- 缺点:较新,可能不如其他模式稳定。
调优:
Apache HTTP Server 支持多种工作模式,称为多处理模块(MPM),每种模式都有其特定的用途和性能特点。选择合适的工作模式和调整进程数是提高 Apache 性能的关键步骤。
### 工作模式选择
1. **prefork MPM**
- 特点:非线程化,每个请求由一个单独的进程处理。适用于不支持线程的环境或需要与其他不支持线程的模块(如 PHP)一起使用的情况。
- 优点:稳定,兼容性好。
- 缺点:资源消耗较大,不适合高并发环境。
2. **worker MPM**
- 特点:使用多个子进程,每个子进程包含多个线程。线程比进程轻量,可以处理更多的并发连接。
- 优点:资源利用率高,适合高并发环境。
- 缺点:需要支持线程的操作系统和库,可能存在线程安全问题。
3. **event MPM**
- 特点:类似于 worker,但包括一个特殊的线程来处理保持活动连接,即使在处理长连接时也能保持高性能。
- 优点:在处理大量并发连接时效率高,特别是在使用保持活动连接时。
- 缺点:较新,可能不如其他模式稳定。
### 进程数调优
选择合适的工作模式后,需要根据服务器的硬件资源和预期的负载来调整进程数。以下是一些基本的调优建议:
1. **prefork MPM**
- `StartServers`: 初始启动的服务器进程数。
- `MinSpareServers`: 最小空闲服务器进程数。
- `MaxSpareServers`: 最大空闲服务器进程数。
- `MaxRequestWorkers` (或 `MaxClients`): 允许的最大并发请求数。
- `MaxConnectionsPerChild`: 每个子进程在其生命周期内允许处理的最大连接数。
示例配置:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 20
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
</IfModule>
2. **worker MPM**
- `StartServers`: 初始启动的服务器进程数。
- `MinSpareThreads`: 最小空闲线程数。
- `MaxSpareThreads`: 最大空闲线程数。
- `ThreadsPerChild`: 每个子进程的固定线程数。
- `MaxRequestWorkers` (或 `MaxClients`): 允许的最大并发请求数。
- `MaxConnectionsPerChild`: 每个子进程在其生命周期内允许处理的最大连接数。
示例配置:
<IfModule worker.c>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
</IfModule>
3. **event MPM**
- 配置类似于 worker MPM,但还包括 `MaxRequestsPerChild` 和 `ServerLimit`。
示例配置:
<IfModule event.c>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
</IfModule>
event 工作模式的配置参数几乎与worker模式一样,因为event模式本身就是对worker模式的一种升级改进
apache的mod选择与调优
----------------------------待续--------------------------------------
apache的KeepAline调优
http请求找那个开启KeepAline选项相关与长连接的作用,多次http请求共用一个tcp连接来完成,这样可以节约网络和系统资源。一般开启KeepAline适用于以下如下情况:
- 如果有较多的青苔资源(如js、css、图片等)需要访问,则建议开启长连接
- 如果并发需求非常大,频繁的出现连接建立和连接关闭,则建议开启长连接
- 如果出现这种情况可以考虑关闭KeepAline选项:服务器内存较少并且存在大量动态请求或者文件访问,则建议关闭长连接以节省系统内存和提高apache访问的稳定性。
KeepAlive 相关的主要配置项:
KeepAlive: 这个指令允许你开启或关闭持久连接。通常应该设置为
On
以启用持久连接。KeepAliveTimeout: 这个指令设置了服务器将等待另一个请求的时间,在这段时间内,客户端可以在同一连接上发送多个请求。超时时间过长会导致服务器资源(如内存和线程)被不必要地占用,而设置得太短可能会导致连接频繁地开启和关闭。一个常用的起点是 5 秒,但是根据你的具体场景进行调整。
MaxKeepAliveRequests: 设置在一个持久连接上允许的最大请求数。一旦这个限制被达到,服务器将关闭连接。设置为较高的值可以在一个连接上服务更多的请求,但是太高的值可能会导致服务器资源被长时间占用。一个常见的值是 100,但是你应该根据你的实际需求进行调整。
调优建议:
开启 KeepAlive: 对大多数网站来说,开启 KeepAlive 都会带来明显的性能提升。如果你的网站有很多静态资源,这将是非常有用的。
调整 KeepAliveTimeout: 对于忙碌的站点,将
KeepAliveTimeout
设置得稍微偏低些(比如 2-5 秒)可以帮助释放连接,使得新的请求能够更快被处理。对于流量较低的站点,可以将此值设置得稍高一些,但通常不建议超过 15 秒。平衡 MaxKeepAliveRequests: 将
MaxKeepAliveRequests
设置为一个合理的值(如 100 或 150)可以确保连接被有效利用,而不至于过度占用服务器资源。如果你的网站主要是静态内容,可以设置得更高一些;如果是动态内容较多,可能需要设置得低一些。
示例配置:
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
apache的ab压力测试工具
Apache HTTP server 提供了一个名为 `ab`(ApacheBench)的轻量级压力测试工具。这个命令行工具可以用来运行针对 Web 服务器的基准测试,它能够模拟多个并发请求,并收集关于服务器性能的数据。
### ab 工具的基本用法如下:
ab -n 100 -c 10 http://www.example.com/
在这个例子中:
- `-n 100` 表示运行测试以执行总共 100 个 HTTP 请求。
- `-c 10` 表示并发执行的请求数量为 10。
ab 工具的常见参数包括:
- `-k`:启用 HTTP KeepAlive 特性,即在一个 HTTP 会话中发送多个请求。
- `-t`:测试持续的最长时间(秒),默认情况下,ab 测试会运行直到所有的请求都完成。
- `-p`:允许你指定一个包含要 POST 的数据的文件。
- `-T`:当使用 `-p` 发送 POST 请求时,你需要用这个选项指定内容类型。
- `-H`:添加自定义的请求头,例如:`-H "X-Test-Header: 123"`。
- `-X`:指定一个代理服务器来发送请求通过,例如:`-X 127.0.0.1:8888`。
- `-A`:添加基本的 WWW 认证,格式为 `username:password`。
示例:执行带有 KeepAlive 的测试
ab -n 1000 -c 50 -k http://www.example.com/
这个命令会发送 1000 个请求,以 50 的并发量,并且每个连接会尝试使用 KeepAlive 功能。
高级用法:
使用 POST 请求进行测试:
ab -n 100 -c 10 -p postdata.txt -T 'application/x-www-form-urlencoded' http://www.example.com/form.php
在这个例子中,`postdata.txt` 包含了要提交的数据,`-T` 指定了数据的内容类型。
警告和注意事项:
1. **测试目标**:只在你有权限测试的服务器上使用 ab。在未经授权的服务器上运行压力测试可能被视为攻击。
2. **服务器负载**:ab 可以产生大量请求,在生产服务器上运行可能会对服务造成影响。理想情况下,在一个与生产环境相似的测试环境中运行 ab。
3. **结果解读**:ab 提供了多种性能指标,包括每秒完成的请求数(RPS)、每个请求的平均时间、总体传输速率等。理解这些指标对于解读测试结果至关重要。
4. **资源监控**:在运行 ab 时,你还应该监控服务器的资源利用情况,如 CPU、内存和网络使用情况,以获得全面的性能画面。
5. **安全性**:确定服务器和网络配置可以处理高并发请求,以防止潜在的拒绝服务(DoS)条件。
通过对结果的分析,你可以了解服务器在特定负载下的行为,并据此进行配置优化或硬件升级,以提高应对高流量的能力。
apache的性能监控
apache自身自带了状态监控页面,但是默认是关闭的,可以通过httpd.conf中增加如下配置来打开监控页面
<Location "/server-status">
SetHandler server-status
Order Deny,Allow
Allow from all
</Location>
增加如上配置后,就可以通过访问http://ip:port/server - status来查看监控页面了。
(版本不同,命令有说不同,上方版本为apache2.2)
应用中间件的性能分析与调优
tomcat的组件以及工作原理
tomcat容器Connector性能参数调优
Tomcat容器中的Connector组件是负责处理进来的网络请求,并将这些请求传送到Servlet容器进行处理的组件。适当地调整Connector的性能参数可以提高Tomcat的处理能力和响应速度。下面是一些关于如何调优Tomcat Connector的性能参数的建议。
1. 线程池(Executor)
Tomcat使用线程池来处理传入的连接请求。通过优化线程池参数,可以提高并发处理能力和响应时间。
- `maxThreads`:表示线程池中最大的工作线程数量,应依据服务器的CPU和内存资源以及应用程序的具体需求进行调整。
- `minSpareThreads`:表示线程池中保持空闲的最小线程数,以便能够迅速响应新的请求。
- `maxIdleTime`:线程空闲等待新任务的最长时间,在此时间后,线程会被回收。
2. 连接数限制
- `acceptCount`:当所有可以使用的处理请求的线程数都被使用时,还可以在队列中放置的请求数。超过这个数值后,新的连接会被拒绝。
- `maxConnections`:这个参数限制了同时能够打开的最大连接数。它可以帮助控制Tomcat服务器上的负载。
3. I/O模式
- NIO(Non-Blocking IO)或NIO2:Tomcat 8及以上版本中,默认使用NIO作为IO模式。NIO提供了非阻塞的IO操作,适用于连接数多但每个连接上的请求处理时间较短的场景。
- APR(Apache Portable Runtime):使用本地代码库(例如,在Linux上是EPOLL),可以提供更高的网络性能,但需要额外安装本地库。
4. 超时设置
- `connectionTimeout`:连接超时时间,如果超过这个时间客户端没有发送数据,则连接会被关闭。
- `keepAliveTimeout`:当客户端与服务器保持长连接时,这个参数定义了服务器在关闭这个连接前等待下一次请求的超时时间。
5. 其他优化
- `compression`:如果带宽是瓶颈,可以开启压缩。这个设置允许Tomcat压缩某些MIME类型的数据。
- `useSendfile`:对于静态文件传输,如果设置为`true`,Tomcat将使用操作系统级别的sendfile功能来提高传输效率。
- `disableUploadTimeout`:对于上传大文件,可以禁用与上传相关的超时时间。
示例配置
以下是在`server.xml`中配置Connector的一个示例:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="150"
minSpareThreads="25"
acceptCount="100"
enableLookups="false"
compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,application/json,application/javascript"
useSendfile="true"/>
重要提示:在进行任何性能调整时,都应该先在测试环境进行测试,以确保这些调整不会对系统稳定性造成负面影响。调优是一个逐步迭代的过程,可能需要多次调整和测试才能找到最佳配置。同时,系统的监控也是至关重要的,它能帮助你理解调整的效果,并在必要时做出调整。
tomcat容器I/O分析与调优
1. 同步阻塞I/O(BIO)
- 原理:在同步阻塞模式下,服务器为每个请求创建一个新的线程。线程在处理I/O(如读取输入、发送输出)时会阻塞,即线程暂停执行直到I/O完成。
- 应用场景:适用于连接数较少且持续时间短的应用。因为每个连接都需要一个线程,过多的连接会导致线程过多,增加上下文切换的成本,从而影响性能。
2. 同步非阻塞I/O(NIO)
- 原理:同步非阻塞模式下,服务器使用一个或少数几个线程来处理多个连接。当线程发起一个I/O操作后,如果数据未准备好,线程会继续执行其他任务,不会阻塞在那里等待。
- 应用场景:适用于连接数多但单个连接的活跃度不是特别高的场景。非阻塞模式可以减少线程数量,节省资源,但编程模型比阻塞模式复杂。
3. 异步非阻塞I/O(AIO)
- 原理:异步非阻塞I/O模型中,I/O操作会立即返回,不会等待数据准备完成。当数据准备好后,系统会通知应用程序进行处理。
- 应用场景:适用于高并发且I/O操作非常频繁的应用,如大规模聊天服务器。AIO可以帮助应用程序实现高效的并发处理,减少资源占用。
4. I/O多路复用
- 原理:I/O多路复用是一种通过单一或少数几个线程来监视多个I/O流的准备情况的技术。常见的实现有select、poll、epoll等。线程在一个循环内部不断查询每个I/O流是否有数据就绪,一旦检测到I/O事件,相应的处理函数就会被触发。
- 应用场景:适用于需要高效处理大量连接的场景。尤其是当连接数非常高,而每个连接上的实际数据传输并不频繁时,I/O多路复用可以显著减少系统资源的使用,提高系统的扩展性和效率。
Tomcat中的实现
在Tomcat中,BIO是早期版本的默认模式,而从Tomcat 8开始,NIO成为了默认的I/O处理方式。Tomcat也支持通过配置使用NIO2(AIO的一种实现)和APR(一种使用本地代码库,如Apache Portable Runtime实现多路复用的方式)来进一步优化处理性能。
wildfly的性能分析与调优
----------------------------待续--------------------------------------