GEOM uzip のキャッシュ2008年04月20日 11時19分25秒

GEOM uzip を mdconfig -d -u 1 等と解除すると

md1.uzip: 12095 x 130048 blocks
md1.uzip: 206504 requests, 171473 cached

といったものがコンソールに流される。見ていると uzip はかなりのヒット率を出すことが結構ある。

今まで知らなかったのだが、このキャッシュについて驚愕の事実を見つけた。


struct g_uzip_softc {
        uint32_t blksz;                 /* block size */
        uint32_t nblocks;               /* number of blocks */
        uint64_t *offsets;
        
        struct mtx last_mtx;
        uint32_t last_blk;              /* last blk no */
        char *last_buf;                 /* last blk data */
        int req_total;                  /* total requests */
        int req_cached;                 /* cached requests */
};

        if (start_blk + 1 == end_blk) {
                mtx_lock(&sc->last_mtx);
                if (start_blk == sc->last_blk) {
                        off_t uoff;
        
                        uoff = bp->bio_offset % sc->blksz;
                        KASSERT(bp->bio_length <= sc->blksz - uoff,
                            ("cached data error"));
                        memcpy(bp->bio_data, sc->last_buf + uoff,
                            bp->bio_length);
                        sc->req_cached++;
                        mtx_unlock(&sc->last_mtx);

                        DPRINTF(("%s: start: cached 0 + %lld, %lld + 0 + %lld\n"
,
                            gp->name, bp->bio_length, uoff, bp->bio_length));
                        bp->bio_completed = bp->bio_length;
                        g_io_deliver(bp, 0);
                        return;
                }
                mtx_unlock(&sc->last_mtx);
        }

これを見つけた時は驚いた。guzip のキャッシュはたった一ブロック分しかない。この物凄いヒット率をたった一ブロック分で叩き出しているのを。