blob: b1f83720c158ea2ef40b7f6beed8358821b057f0 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file contains information for gathering Blobfs metrics.
#include <stdio.h>
#include <blobfs/metrics.h>
#include <fs/trace.h>
#include <lib/fzl/time.h>
#include <lib/zx/time.h>
namespace blobfs {
namespace {
size_t TicksToMs(const zx::ticks& ticks) {
return fzl::TicksToNs(ticks) / zx::msec(1);
}
} // namespace
void BlobfsMetrics::Dump() const {
if (!collecting_metrics_) {
return;
}
constexpr uint64_t mb = 1 << 20;
FS_TRACE_INFO("Allocation Info:\n");
FS_TRACE_INFO(" Allocated %zu blobs (%zu MB) in %zu ms\n", blobs_created_,
blobs_created_total_size_ / mb,
TicksToMs(total_allocation_time_ticks_));
FS_TRACE_INFO("Writeback Info:\n");
FS_TRACE_INFO(" (Client) Wrote %zu MB of data and %zu MB of merkle trees\n",
data_bytes_written_ / mb, merkle_bytes_written_ / mb);
FS_TRACE_INFO(" (Client) Enqueued writeback in %zu ms, made merkle tree in %zu ms\n",
TicksToMs(total_write_enqueue_time_ticks_),
TicksToMs(total_merkle_generation_time_ticks_));
FS_TRACE_INFO(" (Writeback Thread) Wrote %zu MB of data in %zu ms\n",
total_writeback_bytes_written_ / mb,
TicksToMs(total_writeback_time_ticks_));
FS_TRACE_INFO("Lookup Info:\n");
FS_TRACE_INFO(" Opened %zu blobs (%zu MB)\n", blobs_opened_,
blobs_opened_total_size_ / mb);
FS_TRACE_INFO(" Verified %zu blobs (%zu MB data, %zu MB merkle)\n",
blobs_verified_, blobs_verified_total_size_data_ / mb,
blobs_verified_total_size_merkle_ / mb);
FS_TRACE_INFO(" Spent %zu ms reading %zu MB from disk, %zu ms verifying\n",
TicksToMs(total_read_from_disk_time_ticks_),
bytes_read_from_disk_ / mb,
TicksToMs(total_verification_time_ticks_));
}
void BlobfsMetrics::UpdateAllocation(uint64_t size_data, const fs::Duration& duration) {
if (Collecting()) {
blobs_created_++;
blobs_created_total_size_ += size_data;
total_allocation_time_ticks_ += duration;
}
}
void BlobfsMetrics::UpdateLookup(uint64_t size) {
if (Collecting()) {
blobs_opened_++;
blobs_opened_total_size_ += size;
}
}
void BlobfsMetrics::UpdateClientWrite(uint64_t data_size, uint64_t merkle_size,
const fs::Duration& enqueue_duration,
const fs::Duration& generate_duration) {
if (Collecting()) {
data_bytes_written_ += data_size;
merkle_bytes_written_ += merkle_size;
total_write_enqueue_time_ticks_ += enqueue_duration;
total_merkle_generation_time_ticks_ += generate_duration;
}
}
void BlobfsMetrics::UpdateWriteback(uint64_t size, const fs::Duration& duration) {
if (Collecting()) {
total_writeback_time_ticks_ += duration;
total_writeback_bytes_written_ += size;
}
}
void BlobfsMetrics::UpdateMerkleDiskRead(uint64_t size, const fs::Duration& duration) {
if (Collecting()) {
total_read_from_disk_time_ticks_ += duration;
bytes_read_from_disk_ += size;
}
}
void BlobfsMetrics::UpdateMerkleDecompress(uint64_t size_compressed,
uint64_t size_uncompressed,
const fs::Duration& read_duration,
const fs::Duration& decompress_duration) {
if (Collecting()) {
bytes_compressed_read_from_disk_ += size_compressed;
bytes_decompressed_from_disk_ += size_uncompressed;
total_read_compressed_time_ticks_ += read_duration;
total_decompress_time_ticks_ += decompress_duration;
}
}
void BlobfsMetrics::UpdateMerkleVerify(uint64_t size_data, uint64_t size_merkle,
const fs::Duration& duration) {
if (Collecting()) {
blobs_verified_++;
blobs_verified_total_size_data_ += size_data;
blobs_verified_total_size_merkle_ += size_merkle;
total_verification_time_ticks_ += duration;
}
}
} // namespace blobfs