zoukankan      html  css  js  c++  java
  • Linux文件系统性能优化

    本文绝大部分是转载自CSDN刘爱贵专栏: http://blog.csdn.net/liuben/archive/2010/04/13/5482167.aspx另外根据参考文档增补了一部分内容。

    由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍适用性。然而在特定应用下,这种配置往往在I/O 性能方面不能达到最优。因此,如果应用对I/O性能要求较高,除了采用性能更高的硬件(如磁盘、HBA卡、CPU、MEM等)外,我们还可以通过对文件系统进行性能调优,来获得更高的I/O性能提升。总的来说,主要可以从三个方面来做工作:

    1、Disk相关参数调优
    2、文件系统本身参数调优
    3、文件系统挂载(mount)参数调优

    当然,负载情况不同,需要结合理论分析与充分的测试和实验来得到合理的参数。下面以SAS(Serial attached SCSI)磁盘上的EXT3文件系统为例,给出Linux文件系统性能优化的一般方法。请根据自身情况作适合调整,不要生搬硬套。
    1、Disk相关参数
    1.1 Cache mode:启用WCE=1(Write Cache Enable), RCD=0(Read Cache Disable)模式

    sdparm -s WCE=1, RCD=0 -S /dev/sdb

    1.2 Linux I/O scheduler算法
    经过实验,在重负载情形下,deadline调度方式对squidI/O负载具有更好的性能表现。其他三种为noop(fifo), as, cfq,noop多用于SAN/RAID存储系统,as多用于大文件顺序读写,
    cfq适于桌面应用。

    echo deadline > /sys/block/sdb/queue/scheduler

    1.3 deadline调度参数
    对于redhat linux建议 read_expire = 1/2 write_expire,对于大量频繁的小文件I/O负载,应当这两者取较小值。更合适的值,需要通过实验测试得到。
    echo 500 > /sys/block/sdb/queue/iosched/read_expire
    echo 1000 > /sys/block/sdb/queue/iosched/write_expire

    1.4 readahead 预读扇区数
    预读是提高磁盘性能的有效手段,目前对顺序读比较有效,主要利用数据的局部性特点。比如在我的系统上,通过实验设置通读256块扇区性能较优。
    blockdev --setra 256 /dev/sdb

    但这个参数对于随机读则没有作用,在SSD硬盘甚至有害,因此在SSD上需要关闭预读。

    1.5 磁盘队列长度
    /sys/block/sda/queue/nr_requests 默认只有 128 个队列,可以提高到 512 个。
    会更加占用内存,但能更加多的合并读写操作,速度变慢,但能读写更加多的量

    2、EXT3文件系统参数
    2.1 block size = 4096 (4KB)
    mkfs.ext3 -b指定,大的数据块会浪费一定空间,但会提升I/O性能。EXT3文件系统块大小可以为1KB、2KB、4KB。

    2.2 inode size
    这是一个逻辑概念,即一个inode所对应的文件相应占用多大物理空间。mkfs.ext3 -i指定,可用文件系统文件大小平均值来设定,可减少磁盘寻址和元数据操作时间。

    2.3 reserved block
    mkfs.ext3 -m指定,缺省为5%,可调小该值以增大部分可用存储空间。

    2.4 disable journal
    对数据安全要求不高的应用(如web cache),可以关闭日志功能,以提高I/O性能。
    tune2fs -O^has_journal /dev/sdb

    3、mount参数
    3.1 noatime, nodirtime
    访问文件目录,不修改访问文件元信息,对于频繁的小文件负载,可以有效提高性能。

    3.2 async
    异步I/O方式,提高写性能。

    3.3 data=writeback (if journal)
    日志模式下,启用写回机制,可提高写性能。数据写入顺序不再保护,可能会造成文件系统数据不一致性,重要数据应用慎用。

    3.4 barrier=0 (if journal)
    barrier=1,可以保证文件系统在日志数据写入磁盘之后才写commit记录,但影响性能。重要数据应用慎用,有可能造成数据损坏。

    4、小结
    以/dev/sdb为例,优化操作方法如下,参数请自行调整。

    sdparm -s WCE=1, RCD=0 -S /dev/sdb
    echo deadline > /sys/block/sdb/queue/scheduler
    echo 500 > /sys/block/sdb/queue/iosched/read_expire
    echo 1000 > /sys/block/sdb/queue/iosched/write_expire
    echo 512 > /sys/block/sda/queue/nr_requests
    blockdev --setra 256 /dev/sdb
    mkfs.ext3 -b 4096 -i 16384 -m 2 /dev/sdb1
    tune2fs -O^has_journal /dev/sdb1
    mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async,data=writeback,barrier=0 (if with journal)
    mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async (if without journal)

    参考文档:
    http://kezeodsnx.pixnet.net/blog/post/25428632-performance-tuning
    http://www.addalab.it/oracle-and-linux-io-schedulers-part-1
    http://www.addalab.it/oracle-and-linux-io-schedulers-part-2
    http://www.monperrus.net/martin/scheduler+queue+size+and+resilience+to+heavy+IO
    http://hi.baidu.com/roxws/item/76c6819adac1ef8d581461eb

  • 相关阅读:
    Remove Element leetcode java
    Remove Duplicates from Sorted Array leetcode java
    Container With Most Water leetcode java
    Divide Two Integers leetcode java
    N-Queens II leetcode java
    N-Queens leetcode java
    Pow(x,n) leetcode java
    Single Number II leetcode java
    Single Number leetcode java
    ROS第一次开网站跳转到公告页(任意地址跳转)方法
  • 原文地址:https://www.cnblogs.com/tcicy/p/8458254.html
Copyright © 2011-2022 走看看