К вопросу об FS
От: Cyberax Марс  
Дата: 02.03.06 16:24
Оценка: 31 (5)
Сегодня сделал тесты разных файловых систем. Исходник вот здесь:
http://rsdn.ru/File/37054/benchmark.zip (для компиляции требуется версия
Boost из CVSа).

В тесте создается каталог с N файлами, а затем M раз выполняется stat()
и fopen/fclose, где N — первый параметр, M — второй параметр.

Вот результат с Reiser4:

root@prlinux:/tmp/benchmark# ./benchmark 1000 1000000
Starting files creation...
Finished files creation. Time:0.06
Timing 'stat'...
Finished timing:2.76, 1000000 iterations.
Timing open/close...
Finished timing:6.64, 1000000 iterations.
Starting files removing...
Finished files removing. Time:0.11

root@prlinux:/tmp/benchmark# ./benchmark 100000 1000000
Starting files creation...
Finished files creation. Time:6.26
Timing 'stat'...
Finished timing:3.61, 1000000 iterations.
Timing open/close...
Finished timing:7.61, 1000000 iterations.
Starting files removing...
Finished files removing. Time:11.63

root@prlinux:/tmp/benchmark# ./benchmark 300000 1000000
Starting files creation...
Finished files creation. Time:18.77
Timing 'stat'...
Finished timing:3.77, 1000000 iterations.
Timing open/close...
Finished timing:7.6, 1000000 iterations.
Starting files removing...
Finished files removing. Time:35.85


То есть видно, что элементы добавляются за O(1), а поиск идет за O(log
N) времени. То есть Reiser4 вполне себе подходит для больших объемов
данных, особенно если учитывать возможность построения custom'ных
индексов по хранимым файлам (в том числе и по содержанию). Скорость
работы тоже вполне приемлима.

В NTFS под Windows все намного хуже — видна работа маляра Шлэмиля (или
менее оптимальные алгоритмы работы с диском):

C:\temp\benchmark\bin\msvc\release>benchmark.exe 1000 1000000
Starting files creation...
Finished files creation. Time:0.31
Timing 'stat'...
Finished timing:12.338, 1000000 iterations.
Timing open/close...
Finished timing:25.146, 1000000 iterations.
Starting files removing...
Finished files removing. Time:0.14

C:\temp\benchmark\bin\msvc\release>benchmark.exe 10000 1000000
Starting files creation...
Finished files creation. Time:3.094
Timing 'stat'...
Finished timing:13.74, 1000000 iterations.
Timing open/close...
Finished timing:25.727, 1000000 iterations.
Starting files removing...
Finished files removing. Time:3.274

C:\temp\benchmark\bin\msvc\release>benchmark.exe 50000 1000000
Starting files creation...
Finished files creation. Time:31.064
Timing 'stat'...
Finished timing:23.714, 1000000 iterations.
Timing open/close...
Finished timing:35.842, 1000000 iterations.
Starting files removing...
Finished files removing. Time:12.468

При этом тестовая виндовая намного машина лучше линуксовой.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: К вопросу об FS
От: MShura  
Дата: 02.03.06 17:12
Оценка:
C>Сегодня сделал тесты разных файловых систем. Исходник вот здесь:
C>http://rsdn.ru/File/37054/benchmark.zip (для компиляции требуется версия
C>Boost из CVSа).

C>В тесте создается каталог с N файлами, а затем M раз выполняется stat()

C>и fopen/fclose, где N — первый параметр, M — второй параметр.


C>В NTFS под Windows все намного хуже — видна работа маляра Шлэмиля (или

C>менее оптимальные алгоритмы работы с диском):

Отключена ли генерация коротких имен?
Эта фича может съедать много времени на больших каталогах (касается функции stat).

http://technet2.microsoft.com/WindowsServer/en/Library/61cd1970-5254-47c2-96d4-a66c780446381033.mspx

По-умолчанию на desktop версиях Windows генерация коротких имен включена, а на серверных отключена
Re[2]: К вопросу об FS
От: Cyberax Марс  
Дата: 02.03.06 17:15
Оценка: :)
MShura wrote:
> C>В NTFS под Windows все намного хуже — видна работа маляра Шлэмиля (или
> C>менее оптимальные алгоритмы работы с диском):
> Отключена ли генерация коротких имен?
Да, как и отслеживание времени последнего доступа. Также поставлен режим
"большого кэша".

Я долго и безуспешно пытался сделать Windows быстрее
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: К вопросу об FS
От: MShura  
Дата: 02.03.06 18:22
Оценка:
C>Я долго и безуспешно пытался сделать Windows быстрее

Хорошо, тогда возможно это связано с тем, что Linux открывает все файлы которые видит (даже если они никогда не будут открыты) более того при закрытии файла описатель файла по прежнему живет.

В NTFS for Windows правда тоже есть так называемое туннелирование (ускорение открытия только что закрытого файла), но к сожалению в этом вопросе я не большой спец.

Возможно политика открытия файлов + туннелирование в Linux продуманы лучше, а может лучше подходит для данной тестовой ситуации.

К тому же, по-моему, Reiser4 значительно моложе NTFS и у них было больше шансов учесть преимущества/недостатки предыдущих FS.
Re[4]: К вопросу об FS
От: marat321  
Дата: 03.03.06 09:36
Оценка:
В Reiser4 все есть дерево и листья на этом дереве. Файлы и директории реализованы, как плагины для доступа к этому дереву. Журналирование реализовано через однократную запись, т.е. запись в журнале после коммита транзакции становится частью файловой системы, а значит и нет выделенного места для хранения журнала (выделены только структуры, управляющие журналом). Также реализована перестановка очереди записи в кеше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: К вопросу об FS
От: Cyberax Марс  
Дата: 03.03.06 10:14
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Хорошо, тогда возможно это связано с тем, что Linux открывает все файлы которые видит (даже если они никогда не будут открыты) более того при закрытии файла описатель файла по прежнему живет.

Их там в каталоге было до миллиона (а я делал тесты и до нескольких миллионов потом уже).

MS>Возможно политика открытия файлов + туннелирование в Linux продуманы лучше, а может лучше подходит для данной тестовой ситуации.

MS>К тому же, по-моему, Reiser4 значительно моложе NTFS и у них было больше шансов учесть преимущества/недостатки предыдущих FS.
Конечно. Вот только MS не собирается даже поддерживать полноценное подключение других файловых систем. А так бы можно было подключить Reiser4 вместо старой NTFS и наслаждаться.
Sapienti sat!
Re[5]: К вопросу об FS
От: Left2 Украина  
Дата: 03.03.06 11:09
Оценка:
C>Конечно. Вот только MS не собирается даже поддерживать полноценное подключение других файловых систем. А так бы можно было подключить Reiser4 вместо старой NTFS и наслаждаться.

Странно, я почему-то думал что это возможно. Ведь была же тулза, позволяющие видеть FAT32-диски WindowsNT 4.0. Или что имеется в виду под полноценным подключением? Возможность грузить Windows с диска форматированного Reiser4?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: К вопросу об FS
От: Cyberax Марс  
Дата: 03.03.06 11:15
Оценка:
Left2 wrote:
> C>Конечно. Вот только MS не собирается даже поддерживать полноценное
> подключение других файловых систем. А так бы можно было подключить
> Reiser4 вместо старой NTFS и наслаждаться.
> Странно, я почему-то думал что это возможно. Ведь была же тулза,
> позволяющие видеть FAT32-диски WindowsNT 4.0.
Можно и ext2-диски подключать.

> Или что имеется в виду под полноценным подключением? Возможность

> грузить Windows с диска форматированного Reiser4?
Да.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: К вопросу об FS
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 12:18
Оценка: 29 (4)
Здравствуйте, Cyberax, Вы писали:

C>Сегодня сделал тесты разных файловых систем. Исходник вот здесь:

C>http://rsdn.ru/File/37054/benchmark.zip (для компиляции требуется версия
C>Boost из CVSа).

C>В тесте создается каталог с N файлами, а затем M раз выполняется stat()

C>и fopen/fclose, где N — первый параметр, M — второй параметр.

А я твой вариант без Boost-а сделал и еще несколько доработок:
— создаются файлы случайного размера;
— для проверки времени обращения к описанию файла используется access;
— для проверки времени обращения к файлу производится загрузка файла (по идее, эти операции должны выгружать больше информации из кэша файловой системы).

На моем нуотбуке под Linux-ом (2.6.13) и ReiserFS получаются следующие значения:
1000 файлов и 1000000 итераций:

Starting 'Populating'...
Finish 'Populating', total: 0, per opt: 0
Starting 'Accessing'...
Finish 'Accessing', total: 0.79, per opt: 7.9e-07
Starting 'Manipulating'...
Finish 'Manipulating', total: 0.79, per opt: 7.9e-07
Starting 'Removing'...
Finish 'Removing', total: 0, per opt: 0

100000 файлов и 1000000 итераций:

Starting 'Populating'...
Finish 'Populating', total: 0.22, per opt: 2.2e-06
Starting 'Accessing'...
Finish 'Accessing', total: 0.91, per opt: 9.1e-07
Starting 'Manipulating'...
Finish 'Manipulating', total: 0.91, per opt: 9.1e-07
Starting 'Removing'...
Finish 'Removing', total: 0.07, per opt: 7e-07

1000000 файлов и 1000000 итераций:

Starting 'Populating'...
Finish 'Populating', total: 2.24, per opt: 2.24e-06
Starting 'Accessing'...
Finish 'Accessing', total: 1.06, per opt: 1.06e-06
Starting 'Manipulating'...
Finish 'Manipulating', total: 1.06, per opt: 1.06e-06
Starting 'Removing'...
Finish 'Removing', total: 0.73, per opt: 7.3e-07

Даже ReiserFS v3 очень хорошо себя ведет.

А вот NTFS под WinXP на том же ноутбуке..
1000 файлов и 1000000 итераций:

Starting 'Populating'...
Finish 'Populating', total: 1.687, per opt: 0.001687
Starting 'Accessing'...
Finish 'Accessing', total: 12.768, per opt: 1.2768e-005
Starting 'Manipulating'...
Finish 'Manipulating', total: 12.738, per opt: 1.2738e-005
Starting 'Removing'...
Finish 'Removing', total: 1.161, per opt: 0.001161

100000 файлов и 1000000 итераций:

Starting 'Populating'...
Finish 'Populating', total: 269.361, per opt: 0.00269361
Starting 'Accessing'...
Finish 'Accessing', total: 209.98, per opt: 0.00020998
Starting 'Manipulating'...
Finish 'Manipulating', total: 47.645, per opt: 4.7645e-005
Starting 'Removing'...
Finish 'Removing', total: 168.138, per opt: 0.00168138

Хорошее время для теста 'Manipulating', видимо, объясняется тем, что нужная информация была закэширована при выполнении 'Accessing'.
А тест на 1M файлов в каталоге я даже запускать не стал

Все настройки для FS по умолчанию.

Ну а вообще Unix-овые FS -- это классно!

Вот код теста:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>

#if !defined(__unix__)
#include <io.h>
#include <direct.h>

int make_dir( const char * name ) { return mkdir( name ); }
#else
#include <unistd.h>

int make_dir( const char * name ) { return mkdir( name, S_IREAD | S_IWRITE ); }
#if !defined( O_BINARY )
#define O_BINARY 0
#endif
#endif

#include <sys/stat.h>

template< class Actor >
void
measure( const char * operation_name, Actor a )
{
    std::cout << "Starting '" << operation_name << "'..." << std::endl;

    clock_t start = clock();
    size_t opts = a();
    clock_t finish = clock();

    double total_sec = double( finish - start ) / CLOCKS_PER_SEC;
    std::cout << "Finish '" << operation_name << "', total: "
        << total_sec << ", per opt: "
        << total_sec / opts << std::endl;
}

const size_t file_data_size = 8 * 1024;
size_t file_data[ file_data_size ];

class file_creator_t
{
    size_t m_num_files;
    std::vector< std::string > &    m_files;
    const std::string & m_test_dir;

public :
    file_creator_t(
        size_t num_files,
        std::vector< std::string > & files,
        const std::string & test_dir )
        :    m_num_files( num_files )
        ,    m_files( files )
        ,    m_test_dir( test_dir )
        {
            for( size_t i = 0; i != file_data_size; ++i )
                file_data[ i ] = i;
        }

    size_t
    operator()()
        {
            for( size_t i = 0; i != m_num_files; ++i )
            {
                char name[ 256 ];
                sprintf( name, "%s/test_file.%u", m_test_dir.c_str(), i );
                m_files.push_back( name );

                size_t offset = rand() % ( file_data_size - 1024 );
                size_t length = ( file_data_size - offset ) / 8 * sizeof( size_t );

                int f = open( name, O_BINARY | O_CREAT | O_RDWR,
                        S_IREAD | S_IWRITE );
                write( f, &file_data[ offset ], length );
                close( f );
            }

            return m_num_files;
        }
};

class file_eraser_t
{
    const std::vector< std::string > & m_files;
public :
    file_eraser_t( const std::vector< std::string > & files )
        :    m_files( files )
        {}

    size_t
    operator()()
        {
            for( size_t i = 0, i_max = m_files.size(); i != i_max; ++i )
                unlink( m_files[ i ].c_str() );

            return m_files.size();
        }
};

class file_accessor_t
{
    const std::vector< std::string > & m_files;
    size_t    m_iterations;
public :
    file_accessor_t(
        const std::vector< std::string > & files,
        size_t iterations )
        :    m_files( files )
        ,    m_iterations( iterations )
        {}

    size_t
    operator()()
        {
            for( size_t i = 0; i != m_iterations; ++i )
            {
                size_t index = rand() % m_files.size();
                access( m_files[ index ].c_str(), 04 );
            }

            return m_iterations;
        }
};

class file_manipulator_t
{
    const std::vector< std::string > & m_files;
    size_t    m_iterations;
public :
    file_manipulator_t(
        const std::vector< std::string > & files,
        size_t iterations )
        :    m_files( files )
        ,    m_iterations( iterations )
        {}

    size_t
    operator()()
        {
            for( size_t i = 0; i != m_iterations; ++i )
            {
                size_t index = rand() % m_files.size();
                int f = open( m_files[ index ].c_str(), O_BINARY | O_RDWR );
                if( -1 != f )
                {
                    read( f, file_data, sizeof( file_data ) );
                    close( f );
                }
            }

            return m_iterations;
        }
};

int main(int argc, char **argv)
{
    size_t num_files, num_ops;
    std::vector< std::string > files;
    if( argc < 3 ||
        !( num_files = atoi( argv[ 1 ] ) ) ||
        !( num_ops = atoi( argv[ 2 ] ) ) )
    {
        std::cerr << "benchmark <num_files> <num_iterations>" << std::endl;
        return 1;
    }
    files.reserve( num_files );

    std::string test_dir( "test" );

    make_dir( test_dir.c_str() );

    measure( "Populating", file_creator_t( num_files, files, test_dir ) );

    measure( "Accessing", file_accessor_t( files, num_ops ) );

    measure( "Manipulating", file_accessor_t( files, num_ops ) );

    measure( "Removing", file_eraser_t( files ) );

    rmdir( test_dir.c_str() );
}


PS
Кстати, у тебя трудносопровождаемый стиль кодирования. Нет пробелов даже между << и операндами


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: К вопросу об FS
От: Cyberax Марс  
Дата: 03.03.06 13:12
Оценка:
eao197 wrote:
> А я твой вариант без Boost-а сделал и еще несколько доработок:
> — создаются файлы случайного размера;
> — для проверки времени обращения к описанию файла используется access;
> — для проверки времени обращения к файлу производится загрузка файла (по
> идее, эти операции должны выгружать больше информации из кэша файловой
> системы).
Ухх... Мне лень было столько писать. Поэтому я и взял Boost — в нем уже
все есть

> Все настройки для FS по умолчанию.

> Ну а вообще Unix-овые FS -- это классно!
Точно!

> PS

> Кстати, у тебя трудносопровождаемый стиль кодирования. Нет пробелов даже
> между << и операндами
Я обычно потоки ввода/вывода вообще не использую И мне нравится,
когда один логический блок "сплошной" — без лишних пробелов.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[2]: К вопросу об FS
От: Alex57  
Дата: 05.03.06 09:45
Оценка:
Здравствуйте, eao197, Вы писали:
E>А вот NTFS под WinXP на том же ноутбуке..
E>1000 файлов и 1000000 итераций:
E>

E>Starting 'Populating'...
E>Finish 'Populating', total: 1.687, per opt: 0.001687
E>Starting 'Accessing'...
E>Finish 'Accessing', total: 12.768, per opt: 1.2768e-005
E>Starting 'Manipulating'...
E>Finish 'Manipulating', total: 12.738, per opt: 1.2738e-005
E>Starting 'Removing'...
E>Finish 'Removing', total: 1.161, per opt: 0.001161


Попробовал NTFS под WinXP на обычном:

Starting 'Populating'...
Finish 'Populating', total: 0.359, per opt: 0.000359
Starting 'Accessing'...
Finish 'Accessing', total: 7.797, per opt: 7.797e-006
Starting 'Manipulating'...
Finish 'Manipulating', total: 7.672, per opt: 7.672e-006
Starting 'Removing'...
Finish 'Removing', total: 0.187, per opt: 0.000187


Но однажды была сбойная ситуация, одновременно работали компьютеры WinFX + NTFS и Linux Suse 9.2 Professional + ReiserFS.
WinFX нормально справился, а вот Linux пришлось переустанавливать.
Как по надежности?
Re[3]: К вопросу об FS
От: Cyberax Марс  
Дата: 05.03.06 11:22
Оценка:
Alex57 wrote:
> Но однажды была сбойная ситуация, одновременно работали компьютеры WinFX
> + NTFS и Linux Suse 9.2 Professional + ReiserFS.
> WinFX нормально справился, а вот Linux пришлось переустанавливать.
> Как по надежности?
Reiser3/4 — это журналируемые FS. Вдобавок в Reiser4 еще и гарантируется
атомарность, так что FS _никогда_ не перейдет в inconsistent-состояние
(при условии нормальной работы команд синхронизации и атомарной записи в
винчестерах, что не всегда так).

Ну а если диск осыпается — то тут уж как повезет.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: К вопросу об FS
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.03.06 13:51
Оценка:
Здравствуйте, Alex57, Вы писали:

A>Но однажды была сбойная ситуация, одновременно работали компьютеры WinFX + NTFS и Linux Suse 9.2 Professional + ReiserFS.

A>WinFX нормально справился, а вот Linux пришлось переустанавливать.

Я думаю, что многие могут подтвердить твой опыт, а многие привести прямо противоположный.

A>Как по надежности?


А бог его знает. Вообще-то ReiserFS -- это журналируемая система, должна выживать после мягких сбоев.
Хотя как-то на linux.org.ru было обсуждение, связанное с надежностью ReiserFS, и многие говорили, что ext3 надежнее. Но на эти слова было много возражений о "кривых ручках"


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: К вопросу об FS
От: Alex57  
Дата: 05.03.06 14:41
Оценка:
Здравствуйте, Cyberax, Вы писали:
C>Ну а если диск осыпается — то тут уж как повезет.

Нет, диск не осыпался, но компьютеры без UPS.
Не смог откатить последнюю транзакцию.
Re[5]: К вопросу об FS
От: Cyberax Марс  
Дата: 05.03.06 15:00
Оценка:
Alex57 wrote:
> C>Ну а если диск осыпается — то тут уж как повезет.
> Нет, диск не осыпался, но компьютеры без UPS.
> Не смог откатить последнюю транзакцию.
Reiser4 не нужно _откатывать_ транзакции. Незафиксированые данные просто
пропадут.

У некоторых винчестеров неправильно реализованы команды сброса кэшей
(чтобы работали быстрее), так что возможно была аппаратная проблема.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: К вопросу об FS
От: Cyberax Марс  
Дата: 05.03.06 15:00
Оценка:
Alex57 wrote:
> C>Ну а если диск осыпается — то тут уж как повезет.
> Нет, диск не осыпался, но компьютеры без UPS.
> Не смог откатить последнюю транзакцию.
Reiser4 не нужно _откатывать_ транзакции. Незафиксированые данные просто
пропадут.

У некоторых винчестеров неправильно реализованы команды сброса кэшей
(чтобы работали быстрее), так что возможно была аппаратная проблема.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: К вопросу об FS
От: Mamut Швеция http://dmitriid.com
Дата: 05.03.06 17:24
Оценка: +1 :)
E>А бог его знает. Вообще-то ReiserFS -- это журналируемая система, должна выживать после мягких сбоев.
E>Хотя как-то на linux.org.ru было обсуждение, связанное с надежностью ReiserFS, и многие говорили, что ext3 надежнее. Но на эти слова было много возражений о "кривых ручках"

Кривые ручки могут уронить все, что можно. Даже то, что нероняемо


dmitriid.comGitHubLinkedIn
Re: К вопросу об FS
От: Кодёнок  
Дата: 06.03.06 06:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

А насколько трудно будет получить встраиваемый рейзер4 под Windows? Например, чтобы работать с файлом как в ФС.
Re[2]: К вопросу об FS
От: Cyberax Марс  
Дата: 06.03.06 06:58
Оценка:
Кодёнок wrote:
> А насколько трудно будет получить встраиваемый рейзер4 под Windows?
> Например, чтобы работать с файлом как в ФС.
В теории, это возможно. Есть, например, read-only драйвер для Reiser3.
На практике это будет достаточно сложно, так как механизмы VFS в Windows
и Linux очень различны.

Ну и производительность все равно будет ниже, чем в Линуксе.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: К вопросу об FS
От: marat321  
Дата: 06.03.06 09:04
Оценка:
Reiser4 не использует в настоящее время VFS (за что Ганса очень сильно пинают мэйнтейнеры).
А насчет таких фич, как рейсер4 в венде, то политика у Ганса проста: заплатите — и все будет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.