Предположим, есть большой файл размером 6,4 ГБ.
Я хочу сравнить скорость его чтения последовательно и случайным образом.
У меня есть простой Python скрипт для измерения
import os
import time
import random
path = './largefile'
file_size = os.stat(path).st_size
assert file_size == 6400000000, file_size
block_size = 64000
f = os.open(path, os.O_RDONLY)
start = time.time()
count = 10000
for i in range(count):
# Method 1: sequentially
content = os.read(f, block_size)
# Method 2: randomly
# offset = random.randint(0, file_size-block_size)
# content = os.pread(f, block_size, offset) # it's the same if I replace pread with lseek+read
elapsed = time.time() - start
print('%.2fMB/s' % ((count*block_size)/10**6/elapsed))
os.close(f)
Когда я запускаю сценарий несколько раз для метода 1 и метода 2, скорость будет следующей:
Method 1:
38.43MB/s
4987.49MB/s
Method 2:
32.81MB/s
29.95MB/s
27.46MB/s
21.20MB/s
...
15.44MB/s
13.44MB/s
Скорость метода 1 такая, как ожидалось (очень близко к скорости чтения, измеренной iotop) сначала, а затем кричаще высокой из-за кеширования страниц. Скорость метода 2 падает, в то время как iotop показывает, что скорость чтения всегда составляет около 35 МБ / с.
Мой вопрос в том, почему скорость чтения iotop составляет 35 МБ / с, а реальная скорость чтения намного ниже (15 МБ / с. s) чем это?
Кстати, я использую CentOS с файловой системой xfs.
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 30G 22G 7.8G 74% /