LINUX.ORG.RU
ФорумTalks

Давайте меряться

 


0

2

Стал замечать что скорость создания/удаление тучи мелких файликов на разных системах (btrfs, ext4, xfs) существенно различается. Запилил по-быстрому скрипт на питоне для замеров:

import os
import random
import time

def CreateFiles(dir, numFiles, maxFileSize):
    try:
        buffer = os.urandom(maxFileSize)
    except Exception as e:
        print( e )
        return

    for i in range(numFiles):
        filePath = dir + '/' + str(i)
        try:
            f = open( filePath, "wb" )
            f.seek( 0 )
            f.write( buffer )
            f.close()
        except Exception as e:
            print( e )

def CreateDirs(dir, numDirs, numFiles, maxFileSize):
    for i in range(numDirs):
        dirPath = dir + '/' + str(i)
        try:
            os.mkdir( dirPath )
        except Exception as e:
            print( e )
        CreateFiles(dirPath, numFiles, maxFileSize)

def RemoveAllFiles(dir, numDirs, numFiles):
    for i in range(numDirs):
        dirPath = dir + '/' + str(i)
        for j in range(numFiles):
            filePath = dirPath + '/' + str(j)
            try:
                os.remove( filePath )
            except Exception as e:
                #print( "File already removed, skipping..." )
                pass
        try:
            os.rmdir( dirPath )
        except Exception as e:
            pass

def RemoveRandomFiles(dir, numDirs, numFiles, numRemovals):
    step = numFiles / numRemovals
    for i in range(numDirs):
        dirPath = dir + '/' + str(i)
        index = 0
        for j in range(numRemovals):
            index += random.randint(1, step)
            filePath = dirPath + '/' + str(index)
            #print( index )
            try:
                os.remove( filePath )
            except Exception as e:
                #print( "File already removed, skipping..." )
                pass

def Main():
    dir = "mnt"
    numFiles = 16 * 1024
    numDirs = 10
    maxFileSize = 4 * 1024
    numRemovals = numFiles / 2

    CurrentTime = lambda: int(round(time.time() * 1000))

    start = CurrentTime()
    CreateDirs(dir, numDirs, numFiles, maxFileSize)
    t = CurrentTime() - start
    print( "Create dirs: %d" % t )

    start = CurrentTime()
    RemoveRandomFiles(dir, numDirs, numFiles, numRemovals)
    t = CurrentTime() - start
    print( "Remove files randomly: %d" % t )

    start = CurrentTime()
    RemoveAllFiles(dir, numDirs, numFiles)
    t = CurrentTime() - start
    print( "Remove all files: %d" % t )

Main()
NOTE: По дефолту создает все временные файлы в текущей директории в «mnt» (я туда монтировал разные разделы)
Что выводит у вас скрипт? Напишите тип вашей файловой системы, опции монтирования этой ФС, SSD или HDD, планировщик ядра
P.S. btrfs'ка может и грузит проц, зато пожимает все в 3-5 раз.



Последнее исправление: nerdogeek (всего исправлений: 1)

ext4, «rw noexec noatime», hdd

Create dirs: 10154
Remove files randomly: 1860
Remove all files: 1862

nerdogeek
() автор топика

Запилил по-быстрому скрипт на питоне для замеров:[/guote] зАмер - это тоже самое, что измеряльщик?

Grruzchik
()

Отдельный НЖМД.

Да, и мерять надо на отдельном НЖМД, чтобы головка не ёрзала на системный раздел писать логи.

И вообще, актуальнее все замеры проводить на ТТН. НЖМД скоро заржавеют и вымрут.

Camel ★★★★★
()

xfs

Create dirs: 26068
Remove files randomly: 3943
Remove all files: 5106

nerdogeek
() автор топика

btrfs

Create dirs: 18321
Remove files randomly: 5178
Remove all files: 11764

nerdogeek
() автор топика

На другой норм. xfs, ssd, noatime, noop.

Create dirs: 9676
Remove files randomly: 3386
Remove all files: 4414

gadfly ★★
()
Ответ на: комментарий от Grruzchik

Запилил по-быстрому скрипт на питоне для замеров:[/guote] зАмер - это тоже самое, что измеряльщик?

Ты, ГРРУзчик, серьёзно не знаешь слова «замер»?

proud_anon ★★★★★
()

небольшой раздел на XFS.

[yuriy@dedup02-10g test]$ python test.py 
Create dirs: 22754
Remove files randomly: 4717
Remove all files: 5429
[yuriy@dedup02-10g test]$ 
[yuriy@dedup02-10g test]$ df -h .
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/mapper/vg_USPV-lv_USPV
                       31T   15T   16T  49% /ProdDedup
[yuriy@dedup02-10g test]$ 
[yuriy@dedup02-10g test]$ mount | grep Prod
/dev/mapper/vg_USPV-lv_USPV on /ProdDedup type xfs (rw)
[yuriy@dedup02-10g test]$ 

TuxR ★★★★
()
Ответ на: комментарий от nerdogeek
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                          
11779 root      20   0       0      0      0 S   1,3  0,0   0:01.93 kworker/1:22                     
  826 root       0 -20       0      0      0 D   0,7  0,0   0:06.60 kworker/2:1H                     
11728 root      20   0       0      0      0 S   0,3  0,0   0:10.32 kworker/2:9  
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,17    0,00    0,00   24,92    0,00   74,92

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             100,00         0,00       400,00          0       1200
gadfly ★★
()
Create dirs: 4948
Traceback (most recent call last):
  File "test.py", line 85, in <module>
    Main()
  File "test.py", line 76, in Main
    RemoveRandomFiles(dir, numDirs, numFiles, numRemovals)
  File "test.py", line 51, in RemoveRandomFiles
    for j in range(numRemovals):
TypeError: 'float' object cannot be interpreted as an integer
NightSpamer
()
Create dirs: 11038
Remove files randomly: 3037
Remove all files: 3042

вот теперь reiserfs noatime,nodiratime,acl,notail,data=writeback

batekman ★★★
()
Ответ на: комментарий от nerdogeek

Да, так лучше.

$ python2 test.py
Create dirs: 3959
Remove files randomly: 1252
Remove all files: 1499
/dev/md1 on /home type ext4 (rw,noatime,nosuid,noexec,nodev)

NightSpamer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.