[轉載請註明出處] http://kezeodsnx.pixnet.net/blog

作者: kezeodsnx

Tune performance是一件很煩的事,看起來好像只是調調參數,其實不然。沒有對整個系統有一定的了解,根本不知從何調起,該調多少,在哪裡調。基本上,tune這件事應該是算advanced skill。下面是有試過的參數:

Reference:Linux performance tuning guide

1. /sys/block/sda/queue/nr_requests: Linux 2.6後的I/O scheduler實作了增加或減少發給disk subsystem的request數量。這個值不會是一體適用的,不同的disk subsystem,不同的worklaod,不同的I/O模式都有影響。即便是相同的disk subsystem,其block/secor size不同也造成影響。修改方式:

echo 64 > /sys/block/sda/queue/nr_requests

2./sys/block/sda/queue/read_ahead_kb (KB): 這個值定義了每一個read operation最多可以讀多少。通常在streaming的情況下會比較有用。在一般使用下,因為是random I/O,設大一些並沒有什麼顯著的改善。修改方式:

echo 512 > /sys/block/<disk_subsystem>/queue/read_ahead_kb

在kernel部分,是在/kernel/block/blk-settings.c裡設定

void blk_queue_make_request(struct request_queue *q, make_request_fn *mfn)
{
        /*
         * set defaults
         */
        q->nr_requests = BLKDEV_MAX_RQ;
        blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS);
        blk_queue_max_hw_segments(q, MAX_HW_SEGMENTS);
        q->make_request_fn = mfn;
        q->backing_dev_info.ra_pages =
                        (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;

對SD的設定為: nr_requests=64, read_ahead_kb=512。

3. /proc/sys/vm: 此目錄下是檔案是用來調整virtual memory和寫dirty page到disk的參數

    swappiness: 這是讓kernel使用swap的傾向,愈高表示用愈多swap。例如:0表示儘量使用memory,100則表示用力的操swap。

    drop_caches: kernel根據這個值來drop clean cache,dentries和inodes,free掉memory

        To free pagecache:

  • echo 1 > /proc/sys/vm/drop_caches

        To free dentries and inodes:

  • echo 2 > /proc/sys/vm/drop_caches

        To free pagecache, dentries and inodes:

  • echo 3 > /proc/sys/vm/drop_caches

To be Continued...

 

 

 

kezeodsnx 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • tzeng015
  • linux block driver

    Hi 你好
    想請教你一件事, 因為我實在搞不懂, 是這樣的我在看linux kernel sd driver時, 看到這些相關的設定, 老實講我時在不是很熟, 如果說接到 sd registre 的設定這個我看得懂, 但是關於那些block driver 的一些設定阿規範我看 linux 驅動程式第三版那邊, 跟我真實在開發的sd driver 有出入, 所以想請教你對這方面是如何去了解的 ?


    blk_queue_max_sectors(dev->queue, 64);
    blk_queue_max_phys_segments(dev->queue, 64);
    blk_queue_max_hw_segments(dev->queue, 64);
    blk_queue_max_segment_size(dev->queue, 1 << 21);

    blk_queue_hardsect_size(dev->queue, 512);
    dev->queue->queuedata = dev;