当前位置:网站首页>Scheme of printing statistical information in log
Scheme of printing statistical information in log
2022-07-01 13:51:00 【zhanglehes】
Summary
Currently maintained c++ service , There will be lock competition when printing logs . First use brpc Positioning lock competition link , Then put forward a centralized improvement plan , And their advantages and disadvantages .
contention Flame chart
Use brpc Print in the pressure measurement environment contention Flame chart .

The circle on the left is the access data of the processing service , The receiving volume will be recorded ,os type , Business party type and other statistical parameters ;
The two smaller circles on the right are two sending downstream , It will record the statistical parameters such as the quantity sent ;
They all use the same lock , When statistics need to be written , Will compete for this lock ;
The size of the data next to the edge of the connection box , You can see that the main lock competition comes from the business function processing the received data . The reason is that our service receives data item by item , But sending data is batch , So the quantity is not equal .
The improved scheme
Each statistical index corresponds to a lock
benefits : The scope of the lock is controlled with minimum force
Disadvantage : When there are many places that need to write a large amount of statistical information , This kind of scene is not suitable
spinlocks
benefits : Not going to happen cs
Disadvantage : When the critical zone is long , Yes cpu The waste of cannot be ignored
Use atomic
benefits : The basic types are x86 The architecture is unlocked
Disadvantage :atomic Although variables are lighter than lock assignment , But it is heavier than ordinary parameter replication . When there are many statistical parameters , This part of the time cost is also huge
contrast atomic And the time cost of locking
atomic
#include<iostream>
#include<atomic>
#include<thread>
using namespace std;
atomic<int> a(0);
void sum() {
for(int i=0; i!=10000000; i++) {
a++;
}
}
int main() {
// cout << a.is_lock_free() << endl;
// Start four threads
thread t1(sum);
thread t2(sum);
thread t3(sum);
thread t4(sum);
t1.join();
t2.join();
t3.join();
t4.join();
int ret = a.load();
cout << ret << endl;
return 0;
}mutex
#include<iostream>
#include<thread>
#include<mutex>
using namespace std;
mutex m;
int a = 0;
int b = 0;
void sum() {
for(int i=0; i!=10000000; i++) {
m.lock();
a++;
m.unlock();
}
}
int main() {
// Start four threads
thread t1(sum);
thread t2(sum);
thread t3(sum);
thread t4(sum);
t1.join();
t2.join();
t3.join();
t4.join();
cout << a << endl;
return 0;
}function
[email protected] cpptest % time ./atomic
40000000
./atomic 3.41s user 0.01s system 395% cpu 0.865 total
[email protected] cpptest % time ./mutex
40000000
./mutex 2.13s user 4.70s system 317% cpu 2.153 totalVisible use atomic after , The overhead of system calls is significantly reduced , Improved performance
Dual version switching
The idea of the plan is Save statistics using dual versions . When it is necessary to record statistical parameters , First get the current version index, You can get which version to write . Open a new thread , Switch every other time interval index, At the same time, print the previous statistical parameters
Code
#include<iostream>
#include<atomic>
#include<vector>
#include<thread>
#include<unistd.h>
using namespace std;
struct Info {
int a{0};
void clear() {a=0;}
};
atomic<int> Index(0); // Point to the current version
vector<Info*> vec_infos; // Save dual version information
void print_info(int idx) { // Print idx Statistical parameters of version
cout << vec_infos.at(idx)->a << endl;
}
void clear_info(int idx) { // take idx The statistical parameters of the version are cleared
vec_infos.at(idx)->a = 0;
}
void printInfo() {
int i=0; // Ensure that the function can exit
int idx=0;
while(i!=10) {
sleep(1);
int next_idx = (idx+1) % 2;
clear_info(next_idx); // To be used Info Zero clearing
Index.store(next_idx); // Switch index, The statistics written later will be put into another Info in
print_info(idx); // Statistics before printing
idx = next_idx; // Point to the new index
i++;
}
}
void writeInfo() { // Write statistical parameters
while(true) {
int idx = Index.load(); // Get current index
vec_infos.at(idx)->a++;
}
}
int main() {
Info* info1 = new Info();
Info* info2 = new Info();
vec_infos.push_back(info1);
vec_infos.push_back(info2); // Dual version statistical parameter initialization
thread t1(printInfo); // Start the print thread
thread t2(writeInfo); // Start the thread that simulates writing statistical parameters
t1.join();
return 0;
}This code is not rigorous , When writing statistical parameters , You may have finished printing , Cause data loss . First of all, the probability is not great ,atomic Of store The time cost of operation is greater than that of ordinary variable assignment ; The second is for statistical information , Even if a small amount of data is lost , No big problem ; Then we can put intervel The time is divided into two parts , stay store Operation and print_info Wait a while before , Ensure that the data of previous versions are written .
边栏推荐
猜你喜欢

6年技术迭代,阿里全球化出海&合规的挑战和探索

SAP intelligent robot process automation (IRPA) solution sharing

QT学习管理系统

Animesr: learnable degradation operator and new real world animation VSR dataset

Kongsong (Xintong Institute) - cloud security capacity building and trend in the digital era

QT learning management system

04-Redis源码数据结构之字典

Etcd 概要 机制 和使用场景

面试题目总结(1) https中间人攻击,ConcurrentHashMap的原理 ,serialVersionUID常量,redis单线程,

Computer network interview knowledge points
随机推荐
用栈实现队列、用队列实现栈(C语言_leetcode_232+225)
El form item regular verification
20个实用的 TypeScript 单行代码汇总
Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its
2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle
Fiori 应用通过 Adaptation Project 的增强方式分享
受益互联网出海 汇量科技业绩重回高增长
3.4 data query in introduction to database system - select (single table query, connection query, nested query, set query, multi table query)
8款最佳实践,保护你的 IaC 安全!
“国防七子”经费暴增,清华足足362亿元,甩第二名101亿 |全国高校2022预算大公开...
04 redis source code data structure dictionary
【剑指 Offer】55 - II. 平衡二叉树
玩转gRPC—不同编程语言间通信
Explain IO multiplexing, select, poll, epoll in detail
French Data Protection Agency: using Google Analytics or violating gdpr
[sword finger offer] 55 - I. depth of binary tree
Uni app realizes advertisement scroll bar
Animesr: learnable degradation operator and new real world animation VSR dataset
陈宇(Aqua)-安全-&gt;云安全-&gt;多云安全
Leetcode第一题:两数之和(3种语言)