Documents/kernel team accomplished projects

出自淘宝内核组

跳转到: 导航, 搜索

目录

已经完成项目

这里是部分我们已经完成的工作,主要包括3类,

  • 将有价值的社区开发的patch合并到线上运行的内核中
  • 针对淘宝的负载特点开发的特性
  • 更多的系统行为profile和trace工具

对于我们自己开发的patch,都已经发到了LKML中,有一部分patch最终并没有被upstream合并,但是在淘宝内部发挥了实际的价值。

Netoops

Netoops是Google工程师对于Netconsole的改进,可以通过IP、MAC层协议在系统内核出现故障时,将OOPS信息通过网络传送到指定的日志服务器上。我们将这个功能合并到了线上运行的内核中,用来在大规模集群中收集服务器内核故障信息。

改进e2fsprogs以查看详细元数据信息

通过分析一个Ext4文件系统上不同类型的(元)数据块个数,系统管理员可以:

  • 评估一个文件系统在运行时buffer cache和page cache可能的占用内存数量
  • 判断针对特定的应用,是否正确的格式化了文件系统(比如是否有太多block分配给了inode table而实际没有多少inode被使用)
  • 如果要将文件系统的元数据放到SSD上以加快速度,则需要评估元数据占用的空间

通过修改e2fsprogs,增加了以下3个功能,初步满足了上述需求,

  • 查看文件系统的各种类型block的统计数据
 dumpe2fs -s <device_path>
  • 查看dir_index型目录的索引块的数量
 htree -b <dir_path>
  • 查看extent文件的extent block数量
 dump_extents <file_path>

page cache命中率统计

为了评价页缓存的使用效率,以及不同预读窗口对于页缓存命中率的改进,我们在内核中增加了统计page cache命中率的接口,对除mmap之外的普通文件I/O的page cache读写命中情况进行统计,并将统计技术通过sysfs输出到用户空间。通过用户态工具解读这些统计计数,可以对运行时系统的page cache命中率进行定量的评估。下面是pagestat工具的输出:

Devices:   read-ahead    read-miss    read-hit    write-miss    write-hit
   sdc:        6794         594       12728        5493        1792
  sdc1:        6794         594       12728        5493        1792
   sdd:        8910         726       17083        3337           8
  sdd1:        8910         726       17083        3337           8

磁盘块I/O访问频率统计

通过对blktrace的输出结果进行分析,我们可以对特定时间段内发生的读、写操作的磁盘块进行I/O频次统计。结合通过将磁盘块I/O频度统计和page cache命中率统计相结合,就可以比较有效的判断服务器节点的cache使用效率。通过这套工具,CDN系统修正了一个固态硬盘上cache管理的缺陷,显著提高了I/O性能(详细信息)。

根据磁盘I/O错误频度将文件系统设置为只读

Hadoop在数据节点上通过access(2)系统调用来判断存储数据的磁盘是否有效;由于hadoop调用access(2),如果系统调用返回错误,则认为磁盘出现了故障。这种方法很不全面,因为除了由于I/O错误导致jbd/jbd2将文件系统设置为read-only外,还有其它原因可能导致access(2)返回错误。当采用nojournal模式的Ext4文件系统时,由于jbd/jbd2不能够在I/O错误发生时将文件系统设置为read-only,所以为了让已经运行在几千台机器上的hadoop软件依旧可以探测到硬盘错误,我们开发了一个patch,它的功能如下:

  • 周期性的统计一定时间内Block I/O层返回的I/O错误
  • 当I/O错误的频度超过一定阈值后,将相应的文件系统设置为read-only
  • 可以通过sysfs接口设置统计周期间隔和I/O错误阈值

这个patch不仅可以统计元数据的I/O错误,也可以统计常规数据的I/O错误,可以更可靠的让hadoop现存的代码在nojournal模式下的Ext4文件系统上运行时更可靠的探测到磁盘I/O错误,并作相应的容错处理。

可调整的TCP TIME_WAIT数值

在TCP连接结束时,服务器端最长会等待120(60x2)秒时间确保对端连接也断开。对于诸如作为前端服务这样并不需要长连接的应用,等待120秒会占用大量线程资源。通过在sysfs中提供一个可以配置的接口,用户可以将这个参数最短设置为1秒钟。在前端服务器的实际运行中,这个修改大大降低了不必要的线程资源,有效的改进了系统性能和服务响应时间。

将vhost-blk迁移到内核空间

将vhost-blk代码迁移到内核空间,可以有效减少虚拟机中I/O的执行路径。这个patch现在已经发布到LKML上,虽然没有被维护者接收,但是从社区中得到了较好的反馈,除了淘宝之外,也有其它公司在进行测试和移植。

iothrottle性能及稳定性测试

详细测试报告

个人工具