I/O 优化
1 I/O 预先读请求的量(内核系统默认先响应读请求,所先响应的量可调):
查看
blockdev --getra /dev/sda 默认值是256 此为单向
or more /sys/block/sda/queue/read_ahead_kb 默认是512 是256的两倍 此为双向
调整
blockdev --setra 512 /dev/sda
or echo 256 /sys/block/sda/queue/read_ahead_kb
2 I/O 请求队列长度(调大能增加硬盘吞吐量,但要占用更多内存):
/sys/block/sda/queue/nr_requests
3 I/O调度算法
more /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfg]
(四种I/O调度算法,[]为选中算法)
每种调度算法的可调参数位于 /sys/block/sda/queue/iosched
变更四种算法
cho noop > /sys/block/sda/queue/scheduler
四种算法详解
deadline (适合小文件读写,跳跃式读写,零散读写(数据库))
iosched 中若干参数说明: read_expire 默认500 此时间一到就写
write_expire 默认5000 此时间一到就读
在此时间内一定可以得到服务
front_merges 0
1(默认)
当新请求与当前请求读写位置相近则可合并优先处理
anticipatory (适合大文件读写,整块式,重复读写(web server))
iosched 中若干参数说明: antic_expire 当一个请求结束后等待此时间长度 看是否有新请求与此请求读写位置近
read_expire 124(默认)
write_expire 248(默认)
cfg (完全公平算法)
iosched 中若干参数说明:queued 请求个数长度
quantum 满多少个请求数写入一次磁盘
优先级 class1 (real-time)实时 值0~7
class2 (best-effort)轮询 值0~7
class3 (idle) 只有空闲时才处理
调整方法 ionice -p 1(进程号)-n7(优先级值)-c2(class级)
优先级值越低,优先级越高
noop(没有算法,适用于SAN架构,不在本地优化)
文件系统优化
1 查看
filefrag -v /file 查看某文件位于文件系统信息
dumpe2fs /dev/sda1 查看某分区信息
2 mke2fs -m 5 /dev/sda1 在/dev/sda1中预留5%的block来防止数据分段
tune2fs -m 10 /dev/sda1 将5%改成10%
tune2fs -r 1000 /dev/sda1 将5%改成具体block数
3 mount -o data=ordered /dev/sda1 (默认) 文件系统日志区仅存放元数据
mount -o data=journal /dev/sda1 把数据与元数据都先写入日志区(安全,慢)
mount -o data=writeback /dev/sda1 不按日志区元数据顺序来写数据(不安全,快)
4 关闭文件系统访问时间更新
mount -o notime /dev/sda1
每隔五秒按日志区元数据来写数据
mount -o commit=5(默认) /dev/sda1
RAID优化
1 yum install sysstat(提供iostat,sar等系统信息查看命令) -y
iostat -x /dev/sda(得到avgrq-sz(每秒平均请求扇区数))
计算chunk size = avgrq-sz * 512 /1024 /RAID磁盘数 (chunk size 值只能取2的n次方)
2 mdadm -C /dec/md0 -l1 -n2 -b /tmp/md0(外部位图) --write-behind=256 /dev/sdc1 --write-mostly /dev/sdd1
(当请求满256时,多出的请求读写/dev/sdd1,否则只读写/dev/sdc1,此方式用于当/dev/sdc1性质优于/dev/sdd1)
3 /sys/block/md0/md/sync_speed_max(磁盘同步最大速度)
/sys/block/md0/md/sync_speed_min(磁盘同步最小速度)