性能定位套路
和以前相似,咱们不可能出现性能问题就把全部工具都跑一遍,而是先运行那几个支持指标较多的工具,如 top,iostat,vmstat等来缩小范围ios
2.文件系统优化
应用程序访问普通文件时,实际是由文件系统间接负责,文件在磁盘中的读写。因此,跟文件系统中相关的也有不少优化 I/O 性能的方式:
1).你能够根据实际负载场景的不一样,选择最适合的文件系统。好比xfs比ext4支持更大的磁盘分区和更大的文件数量,xfs 支持大于 16TB 的磁盘。可是 xfs 文件系统的缺点在于没法收缩,而 ext4 则能够。
2).在选好文件系统后,还能够进一步优化文件系统的配置选项,包括文件系统的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback)、挂载选项(如 noatime)等等。
3).能够优化文件系统的缓存。如能够优化 pdflush 脏页的刷新频率(好比设置 dirty_expire_centisecs 和 dirty_writeback_centisecs)以及脏页的限额(好比调整 dirty_background_ratio 和 dirty_ratio 等)。
4).还能够优化内核回收目录项缓存和索引节点缓存的倾向,即调整 vfs_cache_pressure(/proc/sys/vm/vfs_cache_pressure,默认值 100),数值越大,就表示越容易回收。
5).在不须要持久化时,你还能够用内存文件系统 tmpfs,以得到更好的 I/O 性能 。tmpfs 把数据直接保存在内存中,而不是磁盘中。好比 /dev/shm/ ,就是大多数 Linux 默认配置的一个内存文件系统,它的大小默认为总内存的一半。算法
3.磁盘优化
数据的持久化存储,最终仍是要落到具体的物理磁盘中,同时,磁盘也是整个 I/O 栈的最底层。从磁盘角度出发,天然也有不少有效的性能优化方法。
1).最简单有效的优化方法,就是换用性能更好的磁盘,好比用 SSD 替代 HDD。
2).使用 RAID ,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列。这样作既能够提升数据的可靠性,又能够提高数据的访问性能。
3).针对磁盘和应用程序 I/O 模式的特征,咱们能够选择最适合的 I/O 调度算法。比方说,SSD 和虚拟机中的磁盘,一般用的是 noop 调度算法。而数据库应用,则更推荐使用 deadline 算法。
4).咱们能够对应用程序的数据,进行磁盘级别的隔离。好比,咱们能够为日志、数据库等 I/O 压力比较重的应用,配置单独的磁盘。
5).在顺序读比较多的场景中,咱们能够增大磁盘的预读数据,如能够经过调整内核选项 /sys/block/sdb/queue/read_ahead_kb来调整 /dev/sdb 的预读大小。
6).能够优化内核块设备 I/O 的选项。好比,能够调整磁盘队列的长度 /sys/block/sdb/queue/nr_requests,适当增大队列长度,能够提高磁盘的吞吐量(固然也会致使 I/O 延迟增大)。
7).要注意,磁盘自己出现硬件错误,也会致使 I/O 性能急剧降低,因此发现磁盘性能急剧降低时,你还须要确认,磁盘自己是否是出现了硬件错误。好比,你能够查看 dmesg 中是否有硬件 I/O 故障的日志。 还可使用 badblocks、smartctl 等工具,检测磁盘的硬件问题,或用 e2fsck 等来检测文件系统的错误。若是发现问题,你可使用 fsck 等工具来修复。数据库