Скорость SSD против скорости tmpfs

#python #linux #performance #solid-state-drive #tmpfs

#python #linux #Производительность #твердотельный накопитель #tmpfs

Вопрос:

Я создал tmpfs файловую систему в своем домашнем каталоге в Ubuntu, используя эту команду:

 $ mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0777 tmpfs space
$ df -h space .
File system                  Size    Used Avail. Avail% Mounted at
tmpfs                        1,0G    100M  925M   10%   /home/user/space
/dev/mapper/ubuntu--vg-root  914G    373G  495G   43%   /
  

Затем я написал эту программу на Python:

 #!/usr/bin/env python3

import time
import pickle


def f(fn):
    start = time.time()
    with open(fn, "rb") as fh:
        data = pickle.load(fh)
    end = time.time()
    print(str(end - start)   "s")
    return data


obj = list(map(str, range(10 * 1024 * 1024)))  # approx. 100M


def l(fn):
    with open(fn, "wb") as fh:
        pickle.dump(obj, fh)


print("Dump obj.pkl")
l("obj.pkl")
print("Dump space/obj.pkl")
l("space/obj.pkl")

_ = f("obj.pkl")
_ = f("space/obj.pkl")
  

Результат:

 Dump obj.pkl
Dump space/obj.pkl
0.6715312004089355s
0.6940639019012451s
  

Я смущен этим результатом. Разве tmpfs не является файловой системой, основанной на оперативной памяти, и разве оперативная память не должна быть заметно быстрее, чем любой жесткий диск, включая SSD?

Кроме того, я заметил, что эта программа использует более 15 ГБ оперативной памяти, когда я увеличиваю размер целевого файла до ок. 1 ГБ.

Как это можно объяснить?

Суть этого эксперимента в том, что я пытаюсь найти альтернативные места кэширования для жесткого диска и Redis, которые быстрее и доступны для нескольких рабочих процессов.

Комментарии:

1. Разве вы не использовали cpickle бы, если бы спешили?

2. Скорее вопрос для обсуждения, чем ответ; извините за форматирование, которое это вызывает. Я создал tmpsfs, используя те же средства, что и вы (с тем же именем под моим домом, пробел). $ time dd if=/dev/zero of=space/test.img bs=1048576 count=100 100 0 records in 100 0 records out 104857600 bytes (105 MB, 100 MiB) copied, 0.0231555 s, 4.5 GB/s real 0m0.030s user 0m0.000s sys 0m0.030s

3. И на SSD: $ time dd if=/dev/zero of=test.img bs=1048576 count=100 100 0 records in 100 0 records out 104857600 bytes (105 MB, 100 MiB) copied, 0.165582 s, 633 MB/s real 0m0.178s user 0m0.000s sys 0m0.060s

4. Может быть, python отвечает за время, а не за выбранный FS / medium. 0m0.030s против 0m0.178s … похоже, явный победитель для tmpfs…

5. @tink Да, я могу повторить ваши наблюдения, так что, вероятно, проблема с Python. Я бы предположил, что, возможно, большую часть времени учитывает реконструкция структуры данных Python, так что короткое время чтения не влияет на общее время. заметно.

Ответ №1:

Ответ вытекает из комментариев:

Кажется, что прошедшее время зависит от python, а не от выбранного носителя.

При аналогичной настройке (SSD против tmpfs) с использованием команд ОС в Linux заметна разница в скорости записи файла размером 100 МБ:

Для tmpfs :

 $ time dd if=/dev/zero of=space/test.img bs=1048576 count=100
100 0 records in
100 0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0231555 s, 4.5 GB/s

real    0m0.030s
user    0m0.000s
sys 0m0.030s
  

Для SSD :

 $ time dd if=/dev/zero of=test.img bs=1048576 count=100
100 0 records in
100 0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.165582 s, 633 MB/s

real    0m0.178s
user    0m0.000s
sys 0m0.060s
  

Комментарии:

1. Вы написали 100 MiB , а не 100 MB 🙂 de.wikipedia.org/wiki/Byte#Vergleichstabelle

2. @blueFast -und auch noch in Deutsch! Danke 😉

3. Да, в немецкой статье есть хорошая таблица, которой не хватает в английской версии!