当前位置:网站首页>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 total
Visible 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年技术迭代,阿里全球化出海&合规的挑战和探索
- How much money do novices prepare to play futures? Is agricultural products OK?
- 关于佛萨奇2.0“Meta Force原力元宇宙系统开发逻辑方案(详情)
- Anti fraud, refusing to gamble, safe payment | there are many online investment scams, so it's impossible to make money like this
- SAP 智能机器人流程自动化(iRPA)解决方案分享
- Self cultivation of open source programmers who contributed tens of millions of lines of code to shardingsphere and later became CEO
- 2. Sensor size "recommended collection"
- SAP intelligent robot process automation (IRPA) solution sharing
- spark源码阅读总纲
- Dragon lizard community open source coolbpf, BPF program development efficiency increased 100 times
猜你喜欢
Dragon lizard community open source coolbpf, BPF program development efficiency increased 100 times
日志中打印统计信息的方案
Station B was scolded on the hot search..
Explain IO multiplexing, select, poll, epoll in detail
进入前六!博云在中国云管理软件市场销量排行持续上升
被裁三个月,面试到处碰壁,心态已经开始崩了
【IoT毕设.下】STM32+机智云AIoT+实验室安全监控系统
Etcd summary mechanism and usage scenarios
IO的几种模型 阻塞,非阻塞,io多路复用,信号驱动和异步io
Learning to use livedata and ViewModel will make it easier for you to write business
随机推荐
小程序- view中多个text换行
Arthas use
8 best practices to protect your IAC security!
[anwangbei 2021] Rev WP
MySQL日志
6年技术迭代,阿里全球化出海&合规的挑战和探索
El form item regular verification
Etcd 概要 机制 和使用场景
8款最佳实践,保护你的 IaC 安全!
C language course design topic
【IoT毕设.下】STM32+机智云AIoT+实验室安全监控系统
Self cultivation of open source programmers who contributed tens of millions of lines of code to shardingsphere and later became CEO
Simplex, half duplex, full duplex, TDD and FDD
Six years of technology iteration, challenges and exploration of Alibaba's globalization and compliance
刘对(火线安全)-多云环境的风险发现
Applet - multiple text line breaks in view
面试题目总结(1) https中间人攻击,ConcurrentHashMap的原理 ,serialVersionUID常量,redis单线程,
“国防七子”经费暴增,清华足足362亿元,甩第二名101亿 |全国高校2022预算大公开...
Etcd summary mechanism and usage scenarios
Applet - applet chart Library (F2 chart Library)