GEOM uzip のキャッシュ ― 2008年04月20日 11時19分25秒
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 のキャッシュはたった一ブロック分しかない。この物凄いヒット率をたった一ブロック分で叩き出しているのを。
最近のコメント