テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(writeboost report) マイグレーション調整デーモンの計算する負荷が異常

当該コード. これをループするだけ. 負荷がしきい値以下の時に, allow_migrateという値をtrueにする.

計算式が誤ってるのだろうか?2000くらいの値が出まくる. スケジューリングのオーバーヘッドとかがあるのを考慮しても, 20倍くらいは出てしまってる気がする. readとwriteをとってるので2倍という誤りがあるとしても, 残りの10倍はどこから?計算式が糞?

なぜ?

static void modulator_proc(struct work_struct *work)
{
        struct wb_cache *cache =
                container_of(work, struct wb_cache, modulator_work);
        struct wb_device *wb = cache->wb;

        struct hd_struct *hd = wb->device->bdev->bd_part;
        unsigned long long r_old = 0, w_old = 0, r_new, w_new, util;
        unsigned long intvl = 1000;

        while (true) {
                if (cache->on_terminate)
                        return;

                r_new = jiffies_to_msecs(part_stat_read(hd, ticks[READ]));
                w_new = jiffies_to_msecs(part_stat_read(hd, ticks[WRITE]));

                if (!cache->enable_migration_modulator)
                        goto modulator_update;

                util = (100 * ((r_new - r_old) + (w_new - w_old))) / intvl;
                /* FIXME 2000% ? rediculous */
                WBINFO("%u", (unsigned) util);
                if (util < wb->migrate_threshold)
                        cache->allow_migrate = true;
                else
                        cache->allow_migrate = false;

modulator_update:
                r_old = r_new;
                w_old = w_new;

                schedule_timeout_interruptible(msecs_to_jiffies(intvl));
        }
}

(追記)
io_ticksを使えばよいようである.