gpt4 book ai didi

python - 没有任何缓存的随机偏移二进制原始磁盘写入

转载 作者:行者123 更新时间:2023-12-04 19:35:18 25 4
gpt4 key购买 nike

对于我的应用程序,我正在尝试确定数据备份系统是否遗漏了任何写入。我通过将递增整数计数器写入 1GB 虚拟磁盘来做到这一点,为了确保没有丢失任何写入,我可以查看还原的快照并查看是否有任何间隙(即,如果我看到 1、2、3、0 , 0, 6, 7 我知道备份没有正确写入 4 和 5)。这一切都在 CentOS 7 虚拟机上,主要是用于写入/读取的 Python 2.7 脚本(速度不是一个大问题)
我的问题的很大一部分是缓存:因为我正在模拟随机 I/O,所以写入通常会从缓存中刷新并无序写入磁盘。这使得每个测试都显示为误报,因为在快照时看起来有些数据丢失了。再说一次,我根本不关心效率,所以我不介意写得很慢。读取可以使用缓存,这不是问题,但也无关紧要
以下是我为尝试禁用缓存所做的事情:

  • 使用 sudo hdparm -W 0 /dev/sdb 禁用磁盘写入缓存在哪里 /dev/sdb
  • 写入没有文件系统的原始磁盘,因此没有文件系统缓存
  • with open 上设置缓冲标志在 Python 脚本中为 0(无 Python 写入缓存)

  • 确保我的写入按顺序放在磁盘上基本上是一项不可能完成的任务吗?我只需要在写#(n+1)之前写#(n),在#(n+2)之前写#(n+1),等等。
    这是我用来写入磁盘的 Python 脚本(SIZE 和 PRIME 会根据磁盘大小和随机种子而变化):
    from struct import pack, unpack
    import sys
    SIZE,PRIME = [x],[x]
    # random I/O traversal iterator
    def rand_index_generator(a,b):
    ctr=0
    while True:
    yield (ctr%b)
    ctr+=a

    with open('/dev/sdb', 'rb+', buffering=0) as f:
    index_gen = rand_index_generator(PRIME, SIZE)
    # random traversal using iterator above, write counter to file
    for counter in xrange(1, SIZE-16):
    f.seek(index_gen.next()*4)
    f.write(pack('>I', counter))
    然后为了验证,我以相同的顺序遍历并注意未写入数据的间隙。这是在将 VM 还原回快照之后。我知道所有的遍历和写入工作都有效,因为验证将顺利进行,在恢复之前不会丢失任何写入,但我认为一些“写入”数据在 RAM 中死去并且不会进入磁盘
    将采取任何建议来保证我需要此应用程序的写入顺序

    最佳答案

    找到了这个问题的答案。我误解了写入原始磁盘的效果,它并没有消除操作系统缓存,因为我仍在调用操作系统来写入我的原始磁盘。哎呀
    要绕过操作系统缓存,您应该使用 os.open并通过 os.O_DIRECTos.O_SYNC标志以确保写入以正确的顺序发生( more info on those flags )并且不会卡在 volatile 内存中。我用了mmap和 os 文件描述符,但您也可以使用普通文件句柄 like this
    页面大小特定于您的操作系统。对于 Linux,它是 4096
    代码的顶部保持不变,但这里是写循环:

    PAGESIZE = 4096
    filedesc = os.open('/dev/sdb', os.O_DIRECT|os.O_SYNC|os.O_RDWR)
    for counter in xrange(1, SIZE-16):
    write_loc = index_gen.next()*4
    page_dist = (write_loc%PAGESIZE)
    offset = write_loc - page_dist
    bytemap = mmap.mmap(filedesc, PAGESIZE, offset=offset)
    bytemap[page_dist:(page_dist+4)] = pack('>I', counter)
    bytemap.flush()
    bytemap.close()

    关于python - 没有任何缓存的随机偏移二进制原始磁盘写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72008599/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com