打通IO栈:一次编译服务器性能优化实战( 二 )
如果 页缓存没命中 , 同步都会一路通到 块设备 , 而对于 异步写 , 则是把数据放到 页缓存后返回 , 由内核回刷进程在合适时候回刷到 块设备 。
根据这个流程 , 考虑到我没要到KVM host的权限 , 我只能着手从Guest端的IO栈做优化 , 具体包括以下几个方面:
- 交换分区(swap)
- 文件系统(ext4)
- 页缓存(Page Cache)
- Request层(IO调度算法)
咨询ITer得知 , 服务器都有备用电源 , 能确保不会掉电停机 。 出于这样的情况 , 我们可以尽可能优化速度 , 而不用担心掉电导致数据丢失问题 。
总的来说 , 优化的核心思路是尽可能多的使用内存缓存数据 , 尽可能减小不必要的开销 , 例如文件系统为了保证数据一致性使用日志造成的开销 。
交换分区交换分区的存在 , 可以让内核在内存压力大时 , 把内核认为一些不常用的内存置换到交换分区 , 以此腾出更多的内存给系统 。 在物理内存容量不足且运行吃内存的应用时 , 交换分区的作用效果是非常明显的 。
然而本次优化的服务器反而不应该使用交换分区 。 为什么呢?服务器总内存达到47G , 且服务器除了Jenkins slave进程外没有大量吃内存的进程 。 从内存的使用情况来看 , 绝大部分内存都是被cache/buffer占用 , 是可丢弃的文件缓存 , 因此内存是充足的 , 不需要通过交换分区扩大虚拟内存 。
# free -htotalusedfreesharedbufferscachedMem:47G45G1.6G21M18G16G-/+ buffers/cache:10G36G
交换分区也是磁盘的空间 , 从交换分区置入置出数据可也是要占用IO资源的 , 与本次IO优化目的相悖 , 因此在此服务器中 , 需要取消swap分区 。查看系统状态发现 , 此服务器并没使能swap 。
# cat /proc/swapsFilenameTypeSizeUsedPriority#
文件系统用户发起一次读写 , 经过了虚拟文件系统(VFS)后 , 交给了实际的文件系统 。首先查询分区挂载情况:
# mount.../dev/sda1 on on / type ext4 (rw)/dev/vda1 on /home type ext4 (rw)...
此服务器主要有两个块设备 , 分别是 sda和 vda 。 sda 是常见的 SCSI/IDE 设备 , 我们个人PC上如果使用的机械硬盘 , 往往就会是 sda 设备节点 。 vda 是 virtio 磁盘设备 。 由于本服务器是 KVM 提供的虚拟机 , 不管是 sda 还是 vda , 其实都是虚拟设备 , 差别在于前者是完全虚拟化的块设备 , 后者是半虚拟化的块设备 。 从网上找到的资料来看 , 使用半虚拟化的设备 , 可以实现Host与Guest更高效的协作 , 从而实现更高的性能 。 在此例子中 , sda 作为根文件系统使用 , vda 则是用于存储用户数据 , 在编译时 , 主要看的是 vda 分区的IO情况 。vda 使用 ext4 文件系统 。 ext4 是目前常见的Linux上使用的稳定的文件系统 , 查看其超级块信息:
# dumpe2fs /dev/vda1...Filesystem features:has_journal dir_index ......Inode count:196608000Block count:786431991Free inodes:145220571Block size:4096...
我猜测ITer使用的默认参数格式化的分区 , 为其分配了块大小为4K , inode数量达到19660万个且使能了日志 。块大小设为4K无可厚非 , 适用于当前源文件偏小的情况 , 也没必要为了更紧凑的空间降低块大小 。 空闲 inode 达到 14522万 , 空闲占比达到 73.86% 。 当前 74% 的空间使用率 , inode只使用了26.14% 。 一个inode占256B , 那么10000万个inode占用23.84G 。 inode 实在太多了 , 造成大量的空间浪费 。 可惜 , inode数量在格式化时指定 , 后期无法修改 , 当前也不能简单粗暴地重新格式化 。
我们能做什么呢?我们可以从日志和挂载参数着手优化
日志是为了保证掉电时文件系统的一致性 , (ordered日志模式下)通过把元数据写入到日志块 , 在写入数据后再修改元数据 。 如果此时掉电 , 通过日志记录可以回滚文件系统到上一个一致性的状态 , 即保证元数据与数据是匹配的 。 然而上文有说 , 此服务器有备用电源 , 不需要担心掉电 , 因此完全可以把日志取消掉 。
# tune2fs -O ^has_journal /dev/vda1tune2fs 1.42.9 (4-Feb-2014)The has_journal feature may only be cleared when the filesystem isunmounted or mounted read-only.
可惜失败了 。 由于时刻有任务在执行 , 不太好直接umount或者-o remount,ro , 无法在挂载时取消日志 。 既然取消不了 , 咱们就让日志减少损耗 , 就需要修改挂载参数了 。
- 定制|业绩宝APP创始人戴宏伟:依靠人工智能主动获客,打通全链路
- 统计|多久才能换一次手机?统计机构数据有点意外
- 不让|12月第一次统计手机热卖榜 前三果然不让人失望
- 鼓励|(经济)商务部:鼓励引导商务领域减少使用塑料袋等一次性塑料制品
- SVIP|QQ开放QID身份号:SVIP也只能花10元修改一次
- 研发|全球目光紧盯英国,倪光南又一次发出警告:必须阻止这一场交易
- 运维|全栈智能业务运维服务商云智慧完成 D3 轮 6000 万美元融资
- 开发|打通数据应用瓶颈 激活应用场景开发
- 最惨|这是 iPhone 12 被黑最惨的一次!
- 产业|新主导力量来了,上海如何实现一次“革命性重塑”?