Макросы для констант. Иногда нам приходилось делать членов класса static const
и размещать определение в файле .cc.
constexpr
для функций был заменён на специализацию шаблона (1 место).char[]
в одном месте вместе с исправлениями ошибок (пространственная экспериментальная функция).std::chrono
отсутствует поддержка наносекунд (исправлено в предстоящем выпуске STL), и нам пришлось использовать QueryPerfCounter()
в env_win.cc.std::once
, чтобы смягчить ситуацию в WinEnv.Мы стремились сделать её функционально наравне с posix_env. Это означает, что мы максимально точно воспроизвели функциональность пула потоков и других вещей, включая:
use_os_buffer=false
для отключения буферизации диска ОС для WinWritableFile и WinRandomAccessFile.pread/pwrite
на WriteFile/ReadFile
со структурой OVERLAPPED
.SetFileInformationByHandle
для компенсации отсутствия fallocate
.Хотя Windows предоставляет собственную эффективную реализацию пула потоков, мы решили воспроизвести логику posix, используя примитивы std::thread
. Это позволяет любому быстро обнаруживать любые изменения в исходном коде posix и воспроизводить их в среде Windows. Это оказалось очень эффективным. В то же время любой, кто хочет заменить встроенный пул потоков, может сделать это с помощью стекируемых сред RocksDB.
Для дискового доступа мы реализовали всю функциональность, присутствующую в posix_env, которая включает файлы с отображением памяти, произвольный доступ, поддержку ограничителя скорости и т. д.
Флаг use_os_buffer
на платформах Posix в настоящее время обозначает отключение опережающего чтения через механизм fadvise
. В Windows нет системного вызова fadvise
, более того, она реализует кэш диска способом, который сильно отличается от Linux. На Windows нередко выполняют небуферизованный доступ к диску, чтобы контролировать потребление памяти. Мы считаем, что в нашем случае это также может быть хорошим вариантом конфигурации за счёт пропускной способности диска. Вместо этого можно увеличить размер настроенного кэша в памяти. Поэтому мы выбрали use_os_buffer=false
, чтобы отключить буферизацию диска ОС для WinWritableFile
и WinRandomAccessFile
. ОС накладывает ограничения на выравнивание смещений диска, используемых буферов и объёма данных, которые считываются/записываются при доступе к файлам в небуферизованном режиме. Когда опция включена, классы ведут себя стандартным образом. Это позволяет выполнять запись и чтение в случаях, когда небуферированный доступ не имеет смысла, таких как WAL и MANIFEST.
Мы заменили pread/pwrite
на WriteFile/ReadFile
со структурой OVERLAPPED
, чтобы атомарно перейти к позиции операции с диском, но всё ещё выполнять операцию синхронно. Таким образом, мы можем достаточно хорошо имитировать эту функциональность pread/pwrite
. Единственное отличие состоит в том, что указатель файла не возвращается в исходное положение, но это вряд ли имеет значение, учитывая случайный характер доступа.
Мы использовали SetFileInformationByHandle
, чтобы усекать файлы после записи полной последней страницы на диск и предварительно выделять дисковое пространство для ускорения ввода-вывода, компенсируя отсутствие fallocate
, хотя некоторые различия сохраняются. Например, предварительно выделенное пространство не заполняется нулями, как в Linux, однако, с положительной стороны, позиция конца файла также не изменяется после предварительного выделения.
RocksDB переименовывает, копирует и удаляет файлы по своему усмотрению, даже если они могут быть открыты другим дескриптором одновременно. Нам пришлось ослабить требования и разрешить почти все возможные разрешения параллельного доступа.
Локальное хранилище потока играет значительную роль для производительности RocksDB. Вместо создания отдельной реализации мы решили создать... В тексте запроса используется язык программирования C++.
Перевод текста запроса:
«Встроенные обёртки, которые перенаправляют вызовы pthread_specific в интерфейсы Tls Windows в пространстве имён rocksdb::port. Это оставляет существующую логику нетронутой и неизменной, а также легко поддерживаемой.
Чтобы смягчить отсутствие очистки локального хранилища потока при завершении потока, мы добавили ограниченное количество специфичного для Windows кода в тот же файл thread_local.cc, который внедряет обратный вызов очистки в структуру "__tls" в сегменте данных ".CRT$XLB". Этот подход гарантирует, что обратный вызов вызывается независимо от того, используется ли RocksDB в исполняемом файле, автономной DLL или другой DLL.
Когда RocksDB используется с Jemalloc, последний должен быть инициализирован до любого из глобальных переменных или статических объектов C++. Для этого мы внедрили процедуру инициализации в ".CRT$XCT", которая автоматически вызывается средой выполнения перед инициализацией статических объектов. je-uninit ставится в очередь на atexit().
Глобальные операторы new/delete, перенаправляющие jemalloc, используются компоновщиком при выполнении определённых условий. См. раздел сборки в этих заметках.
Мы решили не реализовывать эти две функции, поскольку хостинговая программа, как правило, уже имеет их. Мы не испытывали неудобств при отладке проблем в отладчике или анализе дампов процессов, если это было необходимо, и поэтому не считали это приоритетом.
Все тесты проводятся на одном наборе машин. Вот подробности тестовой настройки:
Тест 1. Массовая загрузка ключей в случайном порядке
Версия 3.11
Версия 3.10
Тест 2. Массовая загрузка ключей в последовательном порядке
Версия 3.11
Версия 3.10
Тест 3. Случайная запись
Версия 3.11
Версия 3.10
Тест 4. Случайное чтение
Версия 3.11
Версия 3.10
Тест 5. Многопоточное чтение и однопоточная запись
Версия 3.11
Версия 3.10
Тест 1. Точечная проверка
Версия 3.11
80 тыс. записей/сек.;
Версия 3.10
10 тыс. записей/сек.
Версия 3.11
Версия 3.10
Тест 2. Префиксный диапазонный запрос
Версия 3.11
80 тыс. записей/сек.;
Версия 3.11:
Версия 3.10:
Мы считаем, что есть ещё большой потенциал для улучшения производительности, и это будет нашей постоянной задачей.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )