Skip to content

Commit 793334e

Browse files
committed
opt(trace):1.9.13, 优化trace::Sink,减少写文件次数
1 parent 07ff3e8 commit 793334e

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

modules/trace/sink.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <sys/syscall.h>
3030
#include <tbox/base/defines.h>
3131
#include <tbox/base/log.h>
32+
#include <tbox/base/assert.h>
3233
#include <tbox/util/fs.h>
3334
#include <tbox/util/string.h>
3435
#include <tbox/util/scalable_integer.h>
@@ -168,6 +169,7 @@ void Sink::commitRecord(const char *name, const char *module, uint32_t line, uin
168169
void Sink::onBackendRecvData(const void *data, size_t size)
169170
{
170171
buffer_.append(data, size);
172+
std::vector<uint8_t> write_cache;
171173

172174
while (buffer_.readableSize() > sizeof(RecordHeader)) {
173175
RecordHeader header;
@@ -176,21 +178,36 @@ void Sink::onBackendRecvData(const void *data, size_t size)
176178
// 而是要先copy到header再使用?
177179
//! A: 因为直接指针引用会有对齐的问题。
178180

181+
auto packet_size = header.name_size + header.module_size + sizeof(header);
179182
//! 如果长度不够,就跳过,等下一次
180-
if ((header.name_size + header.module_size + sizeof(header)) > buffer_.readableSize())
183+
if (packet_size > buffer_.readableSize()) {
184+
TBOX_ASSERT(packet_size < 1024); //! 正常不应该超过1K的,如果真超过了就是Bug
181185
break;
186+
}
182187

183188
buffer_.hasRead(sizeof(header));
184189

185190
const char *name = reinterpret_cast<const char*>(buffer_.readableBegin());
186191
const char *module = name + header.name_size;
187-
onBackendRecvRecord(header, name, module);
192+
onBackendRecvRecord(header, name, module, write_cache);
188193

189194
buffer_.hasRead(header.name_size + header.module_size);
190195
}
196+
197+
if (!write_cache.empty()) {
198+
auto wsize = ::write(curr_record_fd_, write_cache.data(), write_cache.size());
199+
if (wsize != static_cast<ssize_t>(write_cache.size())) {
200+
LogErrno(errno, "write record file '%s' fail", curr_record_filename_.c_str());
201+
return;
202+
}
203+
204+
total_write_size_ += wsize;
205+
if (total_write_size_ >= record_file_max_size_)
206+
CHECK_CLOSE_RESET_FD(curr_record_fd_);
207+
}
191208
}
192209

193-
void Sink::onBackendRecvRecord(const RecordHeader &record, const char *name, const char *module)
210+
void Sink::onBackendRecvRecord(const RecordHeader &record, const char *name, const char *module, std::vector<uint8_t> &write_cache)
194211
{
195212
if (!isFilterPassed(module))
196213
return;
@@ -213,17 +230,10 @@ void Sink::onBackendRecvRecord(const RecordHeader &record, const char *name, con
213230
data_size += util::DumpScalableInteger(name_index, (buffer + data_size), (kBufferSize - data_size));
214231
data_size += util::DumpScalableInteger(module_index, (buffer + data_size), (kBufferSize - data_size));
215232

216-
auto wsize = ::write(curr_record_fd_, buffer, data_size);
217-
if (wsize != static_cast<ssize_t>(data_size)) {
218-
LogErrno(errno, "write record file '%s' fail", curr_record_filename_.c_str());
219-
return;
220-
}
221-
222233
last_timepoint_us_ = record.end_ts_us;
223-
total_write_size_ += wsize;
224234

225-
if (total_write_size_ >= record_file_max_size_)
226-
CHECK_CLOSE_RESET_FD(curr_record_fd_);
235+
std::back_insert_iterator<std::vector<uint8_t>> back_insert_iter(write_cache);
236+
std::copy(buffer, buffer + data_size, back_insert_iter);
227237
}
228238

229239
bool Sink::checkAndCreateRecordFile()

modules/trace/sink.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <limits>
2727
#include <mutex>
2828
#include <set>
29+
#include <vector>
2930

3031
#include <tbox/util/async_pipe.h>
3132
#include <tbox/util/buffer.h>
@@ -109,7 +110,8 @@ class Sink {
109110
using Index = uint64_t;
110111

111112
void onBackendRecvData(const void *data, size_t size);
112-
void onBackendRecvRecord(const RecordHeader &record, const char *name, const char *module);
113+
void onBackendRecvRecord(const RecordHeader &record, const char *name, const char *module,
114+
std::vector<uint8_t> &write_cache);
113115

114116
bool checkAndCreateRecordFile();
115117

version.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
# TBOX版本号
2222
TBOX_VERSION_MAJOR := 1
2323
TBOX_VERSION_MINOR := 9
24-
TBOX_VERSION_REVISION := 12
24+
TBOX_VERSION_REVISION := 13

0 commit comments

Comments
 (0)