Приветствую всех вОблако + сообщество, получить больше крупной технической практики Tencent по галантерее ~
автор:Основная команда облачной базы данных Tencent
Оригинальное название: [Tencent Cloud CDB] Научите играть с MyRocks/RocksDB — СТАТИСТИКА и фоновые темы
0. Intro
на Фейсбукеверсия MySQL(далее именуемый MyRocks), RockSDB — это дополнительный механизм хранения. Важным преимуществом Rocksdb является меньше места на диске по сравнению с движком INNODB. В производственной системе, особенно в Интернет-приложениях уровня выше миллиарда, дисковое пространство является одной из относительно больших затрат, в то время как RockSDB, способный использовать меньше дискового пространства, несомненно, привлекателен. Однако в производственной системе использование новых механизмов хранения, естественно, имеет свои потенциальные риски, за исключением различных инструментов BenchMark для тестирования различных данных о производительности, всесторонние внутренние индикаторы могут помочь нам действительно понять, что происходит в базе данных, для настройки производительности. и развитие имеют руководящее значение. MYROCKS предоставляет более полные внутренние индикаторы с помощью Show Engine Rocksdb Status и нескольких information_schema.
В этой статье будет представлен принцип реализации статистики STATISTICS и фоновых потоков в SHOW ENGINE ROCKSDB STATUS. На основе понимания принципа реализации легче расширить функцию, чтобы она служила нам лучше.
Вызов команды SHOW ENGINE ROCKSDB STATUS возвращает несколько строк данных, включая:
- СТАТИСТИКА: Накопление различного количества/времени всех операций всех потоков движка RocksDB, таких как rockdb.block.cache.hit и rockdb.db.write.micros.
- BG_THREADS: статус фоновых потоков.
- DBSTATS: Статистика операций с базой данных.
- CF_COMPACTION: статистика, связанная с уплотнением каждого семейства столбцов.
- MEMORY_STATS: Использование памяти.
Вызов SHOW ENGINE ROCKSDB STATUS вернет несколько строк данных, но эти данные не сохраняются в таблице заранее, а соответствующие значения в памяти возвращаются пользователю путем вызова функции rockdb_show_status, расположенной в файле rockdb/ha_rocksdb.cc. файл.
1. STATISTICS
Согласно официальным документам RocksDBSTATISTICS, включение СТАТИСТИКИ увеличит дополнительную стоимость на 5%-10%.
Статистика STATISTICS записывает накопление различного количества/времени всех операций всех потоков движка RocksDB. Движок RocksDB создал множество скрытых точек в коде в своих различных операциях, таких как Поместить/Получить/Удалить.
Возьмем в качестве примера функцию GetEntryFromCache, ее функция заключается в возврате доступного кэша блоков. В частности, вы можете видеть, что статистика является параметром GetEntryFromCache и block_cache->Lookup. Правильно, собирает данные отовсюду, опираясь на статистику параметров. Когда доступен блочный кеш, RecordTick вызывается три раза, чтобы увеличить счетчик для трех статистических значений; если блочный кеш недоступен, он также увеличивает счетчик для BLOCK_CACHE_MISS и block_cache_miss_ticker.
Cache::Handle* GetEntryFromCache(Cache* block_cache, const Slice& key,
Tickers block_cache_miss_ticker,
Tickers block_cache_hit_ticker,
Statistics* statistics) {
auto cache_handle = block_cache->Lookup(key, statistics);
if (cache_handle != nullptr) {
PERF_COUNTER_ADD(block_cache_hit_count, 1);
// overall cache hit
RecordTick(statistics, BLOCK_CACHE_HIT);
// total bytes read from cache
RecordTick(statistics, BLOCK_CACHE_BYTES_READ,
block_cache->GetUsage(cache_handle));
// block-type specific cache hit
RecordTick(statistics, block_cache_hit_ticker);
} else {
// overall cache miss
RecordTick(statistics, BLOCK_CACHE_MISS);
// block-type specific cache miss
RecordTick(statistics, block_cache_miss_ticker);
}
return cache_handle;
}
1.1 Интерфейс СТАТИСТИКА RocksDB
Способ использования СТАТИСТИКИ также прост.
Его заголовочные файлы расположены по адресу:
include/rocksdb/statistics.h
monitoring/statistics.h
Инструкции:
Options options;
options.statistics = rocksdb::CreateDBStatistics();
Дополнительные уровни статистики:
- kExceptDetailedTimers: удалить тайминги ожидания и уплотнения мьютекса
- kExceptTimeForMutex: удалить время ожидания мьютекса
- kВсе: все
Существует два типа статистики:
- ticker: count, тип — 64-битное целое число без знака. Используется для измерения счетчиков (например, «rocksdb.block.cache.hit»), суммарных байтов (например, «rocksdb.bytes.writing») или времени (например, «rocksdb.l0.slowdown.micros»).
- гистограмма: Статистическое распределение статистических данных, включая максимум, минимум, среднее значение, медиану и стандартное отклонение.
Интерфейс для статистических функций:
- MeasureTime: имя функции неоднозначно. Фактически значение записывается на гистограмме.
- RecordTick: накопление тикера.
Интерфейс для получения результата:
- Statistics::getTickerCount: укажите тип тикера для получения подсчета.
- Statistics::histogramData: укажите тип Histograms и верните структуру HistogramData, элементами которой являются статистические значения, включая максимальное, минимальное, среднее, медиану и стандартное отклонение.
- Statistics::getHistogramString: задает тип гистограммы и возвращает читаемую строку гистограммы.
- Statistics::ToString(): возвращает удобочитаемую строку, включая все тикеры и гистограммы.
1.2 СТАТИСТИКА реализации RocksDB
RocksDB реализует класс StatisticsImpl и наследует интерфейс Statistics.
Основной интерфейс:
- getTickerCount
- histogramData
- getHistogramString
- getAndResetTickerCount
- recordTick
- measureTime
- ToString
Переменные-члены:
- TickerInfo tickers_[INTERNAL_TICKER_ENUM_MAX];
- HistogramInfo histograms_[INTERNAL_HISTOGRAM_ENUM_MAX];
Структуры данных типов TickerInfo и HistogramInfo здесь аналогичны: локальный счетчик потока или время плюс нелокальная статистика для накопления счетчика или времени.
Тип TickerInfo содержит два параметра:
thread_value типа ThreadLocalPtr (истинный тип ThreadTickerInfo), в том числе:
- значение типа целое число
- Указатель на merged_sum
- merged_sum целочисленного типа
- Тип HistogramInfo содержит два параметра:
thread_value типа ThreadLocalPtr (истинный тип ThreadHistogramInfo), в том числе:
- значение типа HistogramImpl
- указатель на merged_hist
- указатель на merge_lock
- merged_hist типа HistogramImpl
- merge_lock типа Mutex
На самом деле реализация, связанная со СТАТИСТИКОЙ, относительно оригинальна, и это ключ к тому, чтобы использовать СТАТИСТИКУ для увеличения только на 5%-10%. Во избежание частых сбоев кэша ЦП из-за совместного использования данных между потоками, функции merged_sum и merged_hist пусты при инициализации, и тогда и только тогда, когда поток завершается, вызывается функция mergeThreadValue для накопления локальных переменных потока в TickerInfo и HistogreamInfo для merged_sum и merged_hist.
1.3 Использование MyRocks
MyRocks использует интерфейс, предоставляемый RocksDB, для статистики данных. Объявив переменную rockdb_stats и инициализировав ее функцией rockdb_init_func при запуске движка RocksDB.
rocksdb_stats = rocksdb::CreateDBStatistics();
rocksdb_db_options->statistics = rocksdb_stats;
Помимо использования статистики со всех слоев движка RocksDB, MyRocks также определяет
commit_latency_stats = new rocksdb::HistogramImpl();
В двух функциях rockdb_commit_by_xid и rockdb_commit время, потраченное на каждую фиксацию, подсчитывается по времени.
rocksdb::StopWatchNano timer(rocksdb::Env::Default(), true);
...
commit_latency_stats->Add(timer.ElapsedNanos() / 1000);
В функции rockdb_show_status процесс вывода статистики выглядит следующим образом:
- Если задана rockdb_stats, вызовите rockdb_stats->ToString(), чтобы преобразовать статистическое значение в удобочитаемую строку;
- commit_latency_stats — это тип гистограммы, которая выводит соответствующие значения четырех позиций, соответствующих 50%, 95%, 99% и 100%.
- Если определены переменные свойств, такие как is-write-stopped или fact-delayed-write-rate, они также будут выведены.
2 фоновые темы
Результаты, относящиеся к BG_THREADS, можно получить, вызвав SHOW ENGINE ROCKSDB STATUS, и его вывод аналогичен:
Type: BG_THREADS
Name: 140173379593984
Status:
thread_type: Low Pri##
cf_name: default
operation_type: Compaction
operation_stage: CompactionJob::ProcessKeyValueCompaction
elapsed_time_ms: 6172.244 ms
BaseInputLevel: 0
BytesRead: 992806363
BytesWritten: 992071408
IsDeletion: 0
IsManual: 0
IsTrivialMove: 0
JobID: 1936
OutputLevel: 5
TotalInputBytes: 1586832446
state_type:
Вы можете увидеть много информации: этот поток проходит уплотнение, на этапе CompactJob::ProcessKeyValueCompaction это заняло 6172,244 мс, количество прочитанных байтов — 992806363, количество записанных байтов — 992071408. Однако он не включает такую информацию, как исходные и целевые файлы, которые могут представлять интерес для выполняемого сжатия. Как упоминалось в начале статьи, знание того, как работает реализация, позволяет нам лучше масштабироваться.
2.1 Интерфейс и реализация статуса потока
Команда SHOW ENGINE ROCKSDB STATUS в MyRocks показывает, что механизм BG_THREAD использует интерфейс статуса потока в RocksDB.
Его заголовочные файлы расположены по адресу:
include/rocksdb/env.h
include/rocksdb/thread_status.h
util/thread_operation.h
monitoring/thread_status_updater.h
monitoring/thread_status_util.h
ключевой класс:
ThreadStatusUpdater: сохраняет статус соответствующих фоновых потоков и указатели на статус всех фоновых потоков. ThreadStatusUtil: Этот класс имеет только статические переменные и статические методы.Рекомендуется обновлять статус в ThreadStatusUpdater через методы этого класса.
Инструкции:
- Добавьте статистику потока в ThreadStatusUpdater: вызовите ThreadStatusUtil::RegisterThread
- Удалите статистику потока из ThreadStatusUpdater: вызовите ThreadStatusUtil::UnregisterThread
- Другие функции для изменения состояния потока: см. Monitoring/thread_status_util.h
Состояние текущего фонового потока можно получить, вызвав функцию GetThreadList() env, а значение состояния сохраняется в векторе. Отобразите в нем содержимое, подобное следующему изображению:
Как видно из кода, целью реализации состояния потока является отображение текущего состояния очистки и сжатия. Конечно, мы также можем сохранить статус пользовательского потока в статусе потока, который можно отобразить, вызвав команду SHOW ENGINE ROCKSDB STATUS.
В частности, вы можете видеть, что значения состояния, специфичные для уплотнения, следующие:
enum CompactionPropertyType : int {
COMPACTION_JOB_ID = 0,
COMPACTION_INPUT_OUTPUT_LEVEL,
COMPACTION_PROP_FLAGS,
COMPACTION_TOTAL_INPUT_BYTES,
COMPACTION_BYTES_READ,
COMPACTION_BYTES_WRITTEN,
NUM_COMPACTION_PROPERTIES
};
Значения статуса для сброса:
enum FlushPropertyType : int {
FLUSH_JOB_ID = 0,
FLUSH_BYTES_MEMTABLES,
FLUSH_BYTES_WRITTEN,
NUM_FLUSH_PROPERTIES
};
2.2 Использование MyRocks/RocksDB
В реализации пула потоков RocksDB каждый запущенный фоновый поток добавляется к набору наблюдаемых фоновых потоков путем вызова ThreadStatusUtil::RegisterThread.
ThreadPoolImpl::Impl::StartBGThreads-->BGThreadWrapper-->ThreadStatusUtil::RegisterThread
В функции rockdb_show_status процесс вывода BG_THREAD выглядит следующим образом:
- Получите коллекцию ThreadStatus для всех фоновых потоков, вызвав GetThreadList(&thread_list).
- Состояние каждого фонового потока выводится по очереди путем обхода коллекции ThreadStatus.
3. Резюме
В этой статье представлено связанное содержимое STATISTICS и BG_THREAD в инструкции SHOW ENGINE ROCKSDB STATUS.
Связанное Чтение
Глубокая оптимизация ядра MySQL
[Tencent Cloud CDB] Углубленный анализ бинарного журнала MySQL
Эта статья была разрешена автором для публикации в сообществе Yunjia, пожалуйста, укажите при перепечаткеИсточник статьи;