| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #!/usr/bin/python3
- '''This script executes random-sized reads and writes to one or more block devices to test them.
- It will destroy the contents of the block device.'''
- import sys
- import os
- import mmap
- import random
- import time
- class BlockDevice:
- def __init__(self, path, sectorsize = 512):
- self.path = path
- self.dev = os.fdopen(os.open(path, os.O_RDWR | os.O_DIRECT | os.O_SYNC), "rb+", 0)
- self.sectorsize = sectorsize
- def write_block(self, first_sector, sector_count, seed):
- rnd = random.Random(seed)
- buffer = mmap.mmap(-1, sector_count * self.sectorsize)
- buffer.write(rnd.randbytes(sector_count * self.sectorsize))
-
- start = time.time()
- self.dev.seek(first_sector * self.sectorsize)
- self.dev.write(buffer)
- elapsed = time.time() - start
- speed = sector_count * self.sectorsize / elapsed / 1e6
- print("Wrote %16s, %8d, %8d, %8d, %8.3f MB/s" % (self.path, first_sector, sector_count, seed, speed))
- def verify_block(self, first_sector, sector_count, seed):
- rnd = random.Random(seed)
- buffer = mmap.mmap(-1, sector_count * self.sectorsize)
- start = time.time()
- self.dev.seek(first_sector * self.sectorsize)
- self.dev.readinto(buffer)
- elapsed = time.time() - start
- speed = sector_count * self.sectorsize / elapsed / 1e6
- print("Verify %16s, %8d, %8d, %8d, %8.3f MB/s" % (self.path, first_sector, sector_count, seed, speed))
- buffer.seek(0)
- actual = buffer.read(sector_count * self.sectorsize)
- expected = rnd.randbytes(sector_count * self.sectorsize)
- if expected != actual:
- print("Compare error, device = %s, sectorsize = %d, first_sector = %d, sector_count = %d, seed = %d"
- % (self.path, self.sectorsize, first_sector, sector_count, seed))
- fname = "%d" % time.time()
- open(fname + ".expected", "wb").write(expected)
- open(fname + ".actual", "wb").write(actual)
- print("Saved data to %s.expected/actual" % fname)
- raise Exception("Compare error")
- if __name__ == "__main__":
- blockdevs = []
- for path in sys.argv[1:]:
- sectorsize = 512
- if ':' in path:
- path, sectorsize = path.split(':')
- sectorsize = int(sectorsize)
- blockdevs.append(BlockDevice(path, sectorsize=sectorsize))
-
- maxsectors = 100000
- rnd = random.Random()
- while True:
- blocks = []
- start = 0
- while start + 256 < maxsectors:
- start = min(maxsectors, start + rnd.randint(0, 10000))
- dev = rnd.choice(blockdevs)
- count = rnd.randint(1, 256)
- seed = rnd.randint(1, 10000000)
- blocks.append((dev, start, count, seed))
- start += count
-
- print("Write / verify set size: %d" % len(blocks))
- random.shuffle(blocks)
- for dev, start, count, seed in blocks:
- dev.write_block(start, count, seed)
-
- random.shuffle(blocks)
- for dev, start, count, seed in blocks:
- dev.verify_block(start, count, seed)
|