会根据每个进程的优先级和历史I/O请求时间来计算每个队列的权重,然后按照权重顺序调度I/O请求。
使用场景:适合多任务环境下的桌面系统和服务器系统。例如Web服务器、数据库服务器
Deadline调度算法
将I/O请求分为两类:实时I/O请求和普通I/O请求。实时I/O请求是指需要立即响应的请求,例如鼠标、键盘输入等。普通I/O请求是指需要等待一定时间才能得到响应的请求,例如文件读写操作等。
将实时I/O请求插入到队列头部,优先处理;对于普通I/O请求,则会设置一个截止时间(deadline),在此之前尽可能地处理请求。
使用场景:适合需要响应速度较快的应用程序,例如实时音视频应用、游戏等。
NOOP调度算法
一种简单的调度算法,它不会对I/O请求进行排序或调度,而是按照请求的先后顺序依次处理。在高负载的情况下,NOOP调度算法可以减少CPU的消耗,但是在磁盘较忙的情况下可能会导致响应时间较长。
使用场景:适合低负载的系统,例如桌面系统或者轻负载的服务器系统。或者SSD磁盘
修改磁盘调度算法:/sys/block/<device>/queue/scheduler文件
例如:
# 1. 编辑内核参数的配置文件
sudo vim /etc/default/grub
# 2. 找到GRUB_CMDLINE_LINUX_DEFAULT行,并在双引号中添加要修改的内核参数, elevator=cfq表示调度算法设置为cfq
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=cfq"
# 3. 更新GRUB配置
sudo update-grub
$ 4. 重启系统
sudo reboot
# 注意:内核参数是区分大小写,写调度算法名称的时候需要全部小写
# 例如:
elevator=deadline
elevator=cfq
elevator=noop
# 查看当前磁盘使用的调度算法
root@ecs-1746-0001:/sys/block# cat /sys/block/vda/queue/scheduler
[mq-deadline] none # 方括号中的算法名称表示当前生效的调度算法。
4、设置预读取数据的大小
默认情况下,Linux 内核会自动根据设备类型和性能来选择合适的预读取大小。
通过设置块设备的预读取数据大小/sys/block/vda/queue/read_ahead_kb
,以加快读取速度。
# 磁盘缓存的默认大小是128kb
root@ecs-1746-0001:~# cat /sys/block/vda/queue/read_ahead_kb
128
预读取大小的设置规则:
一般预读取大小在 64KB 到 256KB 之间是比较合适,如果太小浪费磁盘IO,太大浪费内存资源。高速 SSD 设备,预读取的大小页不要超过 1MB。
5、优化磁盘碎片
磁盘碎片是指硬盘上存储的文件在写入和删除过程中被分割成不连续的片段,使得文件在硬盘上的物理位置不再是连续的。所以导致磁盘的读写速度变慢。
查看和清理磁盘碎片:
ext4文件系统:
# 查看是否存在磁盘碎片
ehigh@ubuntu:~$ sudo dumpe2fs /dev/sda1
# 清理磁盘碎片 清理sda1的磁盘碎片
ehigh@ubuntu:~$ sudo e4defrag /dev/sda1
xfs文件系统:
# 查看是否存在磁盘碎片
ehigh@ubuntu:~$ sudo xfs_db -c frag /dev/sda1
# 清理磁盘碎片
ehigh@ubuntu:~$ sudo xfs_fsr /dev/sda1
四:对网络进行优化:
1、调整TCP/IP参数来优化网络
Linux系统默认的TCP/IP参数适用于多数情况,但是对于高负载或者高流量的应用需要调整TCP窗口大小、最大并发连接数、最大传输单元(MTU)等参数。
例如:如果需要处理10000个并发连接,可以将这两个参数设置为10000:
echo "10000" > /proc/sys/net/ipv4/tcp_max_syn_backlog # TCP最大连接数,默认是1024
echo "10000" > /proc/sys/net/core/somaxconn # 最大同步连接数,默认是1024
2、开启TCP的快速连接机制
在Linux内核版本3.7及以上,TCP快速打开已经默认启用。CP快速打开可以减少TCP三次握手的时间,从而提高连接速度和性能。
例如:
root@ecs-1746-0001:~# echo "2" > /proc/sys/net/ipv4/tcp_fastopen
# 0:禁用TCP Fast Open功能。
# 1:启用TCP Fast Open客户端功能,但不启用服务器端功能。这是默认值。
# 2:启用TCP Fast Open客户端和服务器端功能。
3、启用TCP拥塞控制算法
例如,Cubic、Reno、BIC等。选择适合自己应用的拥塞控制算法可以提高网络性能和稳定性。
Cubic算法:更为适用于高延迟、高带宽的网络环境
Reno算法:适合传输速度相对较快,延迟较低,丢包率也较低的网络环境
# 当前系统中可用的TCP拥塞控制算法
root@ecs-1746-0001:~# cat /proc/sys/net/ipv4/tcp_available_congestion_control
reno cubic
# 设置TCP拥塞控制算法
root@ecs-1746-0001:~# echo 'cubic' > /proc/sys/net/ipv4/tcp_congestion_control
# 持久化设置
root@ecs-1746-0001:~# vim /etc/sysctl.conf
net.ipv4.tcp_congestion_control=cubic
4、调整网络缓冲区大小
Linux系统默认的网络缓冲区大小适用于大多数情况,但是对于高负载或者高流量的应用,需要调整增大套接字缓冲区大小、读写缓冲区大小等。
例如:如果需要处理大量的网络流量,可以将这些参数设置为较大的值
echo "16777216" > /proc/sys/net/core/wmem_max
echo "16777216" > /proc/sys/net/core/rmem_max
echo "16777216" > /proc/sys/net/core/optmem_max
5、禁用IPv6
如果没有使用IPv6,禁用IPv6协议,从而减少网络连接的负载。
禁用IPV6:
root@ecs-1746-0001:~# vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
root@ecs-1746-0001:~# sysctl -p
6、TCP窗口大小
通过修改窗口的大小,提升网络的传输速度和网络性能。
例如:
sudo vim /etc