Skip to content

Conversation

@0x822a5b87
Copy link

optimizing makefile

原来的docker makefile,每次执行都会删除原来的镜像重建:

docker run --network host --rm -it -v ${PWD}:/mnt -w /mnt ${DOCKER_NAME} bash

build, run, attach, rebuild 拆分开来,按需 rebuild

fix data blocks allocation

当前的算法逻辑取整是错误的,在计算 data_bitmap_blocks 时应该向下取整而不是向上取整。
举个例子:
假设我们 data_total_blocks = 8193,那么

let data_bitmap_blocks = (data_total_blocks + 4096) / 4097;

得到 data_bitmap_blocks = 2,那么总共需要的 blocks 是 2 + 2 * 4096 = 8194,这个大于我们实际的 blocks 数量。

计算 data_bitmap 需要的 blocks 数量,这里的算法逻辑是:

我们期望:

  1. bitmap 的每一个 bit 都对应 data_areas 中的一个有效 block,否则部分 bit 指向无效块,分配时会出错;
  2. bitmap 不能太小,否则大量 data_areas 块无对应 bit 标记,导致这部分块无法被分配。

定义:

  • n = data_bitmap 的块数(每个位图块含 4096 bit,1 bit 对应 1 个 data_areas 块);
  • blocks_used = n(data_bitmap 自身占用的块数) + n*4096(bitmap 能管理的 data_areas 块数);
    核心目标:
    让 blocks_used 尽可能接近 data_total_blocks(data_total_blocks 是 data_bitmap + data_areas 的总块数),
    既保证所有 bitmap 的 bit 都有对应 data_areas 块,又保证绝大多数 data_areas 块都有对应 bit。

又因为:
blocks_used = n + n * 4096 = n * 4097 ≈ data_total_blocks
推导出:
n ≈ data_total_blocks / 4097
为了保证,bitmap 中每个 bit 都有有效 block 可以分配,这里我们需要 向下取整。那么:
n = data_total_blocks / 4097

这样,我们在最好情况下正好用完全部的 blocks,最差情况下浪费 4096 个 blocks。

最差情况:假设有 8193 个 blocks 可用,那么最终是 1 个 bitmap,4096 个 data_area_blocks,剩余的4096个blocks没办法满足我们的需求
最好情况:假设有 8194 个 blocks 可用,那么最终是 2 个 bitmap,8192 个 data_area_blocks,正好用完全部的 blocks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant