Как увеличить скорость чтения моего программного диска в Ubuntu?

У меня есть программа C++ read_bin для чтения сотен двоичных файлов размером 200 МБ на диске. Программа для чтения файла с использованием ifstream:

std::ifstream is(filename,  std::ios::in | std::ios::binary);
is.seekg(startPos, std::ios::beg);
int8_t* buffer = new int8_t [bytesToRead];
is.read(reinterpret_cast<char*>(buffer), bytesToRead);

Я запускаю сотни read_bin процессов в терминале для одновременного чтения отдельных двоичных файлов.

e.g.

read_bin 001.bin
read_bin 002.bin
read_bin 003.bin
read_bin 004.bin
read_bin 005.bin
...
read_bin 101.bin

Это SSD-диск, но я использую iotop для контроля скорости чтения, которая обычно составляет 25MB/s, что очень медленно.

Total DISK READ :      25.35 M/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:      25.35 M/s | Actual DISK WRITE:       7.84 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND 
 2636 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 001.bin
 2631 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 002.bin
 2660 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 003.bin
 2662 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 004.bin
 2665 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 005.bin
 2668 be/4 ubuntu      501.71 K/s    0.00 B/s  0.00 % 99.99 % read_bin 006.bin

Я вижу, что IO заполнен на 99%.

и запустите top:

top - 21:36:58 up 10 min,  3 users,  load average: 95.28, 74.89, 37.27
Tasks: 250 total,   1 running, 188 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us,  0.9 sy,  0.0 ni, 74.9 id, 23.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 30875564 total,  5388416 free, 12671052 used, 12816096 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 17743200 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    
 2633 ubuntu      20   0  147928 133532   3080 D   0.7  0.4   0:00.73 read_bin 
 2652 ubuntu      20   0  147928 133368   2916 D   0.7  0.4   0:00.72 read_bin 
 2697 ubuntu      20   0  145604 131764   2884 D   0.7  0.4   0:00.69 read_bin 
 2701 ubuntu      20   0  145604 131000   2928 D   0.7  0.4   0:00.70 read_bin 
 2630 ubuntu      20   0  147928 134680   2908 D   0.3  0.4   0:00.72 read_bin 
 2632 ubuntu      20   0  147928 134292   2772 D   0.3  0.4   0:00.72 read_bin 
 2634 ubuntu      20   0  147928 134120   2868 D   0.3  0.4   0:00.70 read_bin

Пробовал увеличить буфер bytesToRead, но скорость чтения все равно очень низкая на 25MB/s. Обычно скорость SSD может достигать 500MB/s.

Как исправить мою программу, чтобы максимизировать скорость ЧТЕНИЯ диска?


person L. Lin    schedule 29.01.2019    source источник
comment
Какую производительность чтения вы получите, если запустите только один экземпляр своей программы?   -  person 1201ProgramAlarm    schedule 30.01.2019
comment
Да, запуск слишком большого количества экземпляров чего-либо может значительно ухудшить производительность. Например, если диск перегружен из-за необходимости управлять виртуальной памятью для буферизации всех операций чтения после того, как вы израсходовали всю свою физическую память. Или со всех контекстных переключателей. Больше работников НЕ всегда лучше. Сравните 1 за раз, 2 за раз и т. д. и посмотрите, что произойдет.   -  person Dave S    schedule 30.01.2019


Ответы (1)


Я тестировал в облаке Google. На самом деле это их ограничение производительности диска на уровне 25 МБ/с.

https://cloud.google.com/compute/docs/disks/

person llin    schedule 31.01.2019