当前位置:网站首页>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 .
边栏推荐
- Six years of technology iteration, challenges and exploration of Alibaba's globalization and compliance
- Go整合Logrus实现日志打印
- 【机器学习】VAE变分自编码器学习笔记
- Computer network interview knowledge points
- GET请求如何传递数组参数
- Machine learning summary (I): linear regression, ridge regression, Lasso regression
- Journal MySQL
- 用栈实现队列、用队列实现栈(C语言_leetcode_232+225)
- 3.4 data query in introduction to database system - select (single table query, connection query, nested query, set query, multi table query)
- 2022. Let me take you from getting started to mastering jetpack architecture components - lifecycle
猜你喜欢

算网融合赋能行业转型,移动云点亮数智未来新路标

Introduction to distributed transactions (Seata)

洞态在某互联⽹⾦融科技企业的最佳落地实践

2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle

【Flask】Flask启程与实现一个基于Flask的最小应用程序

Anti fraud, refusing to gamble, safe payment | there are many online investment scams, so it's impossible to make money like this

Dragon lizard community open source coolbpf, BPF program development efficiency increased 100 times

当你真的学会DataBinding后,你会发现“这玩意真香”!

What "hard core innovations" does Intel have in the first half of 2022? Just look at this picture!

逻辑是个好东西
随机推荐
Qtdeisgner, pyuic detailed use tutorial interface and function logic separation (nanny teaching)
SAP 智能机器人流程自动化(iRPA)解决方案分享
盲盒NFT数字藏品平台系统开发(搭建源码)
程序设计的基本概念
C语言课程设计题目
佩服,阿里女程序卧底 500 多个黑产群……
【241. 为运算表达式设计优先级】
Self cultivation of open source programmers who contributed tens of millions of lines of code to shardingsphere and later became CEO
Journal MySQL
leetcode 322. Coin change (medium)
leetcode 322. Coin Change 零钱兑换(中等)
Chen Yu (Aqua) - Safety - & gt; Cloud Security - & gt; Multicloud security
使用net core 6 c# 的 NPOI 包,读取excel..xlsx单元格内的图片,并存储到指定服务器
详细讲解面试的 IO多路复用,select,poll,epoll
Six years of technology iteration, challenges and exploration of Alibaba's globalization and compliance
JVM有哪些类加载机制?
uni-app实现广告滚动条
Introduction to topological sorting
French Data Protection Agency: using Google Analytics or violating gdpr
分布式事务简介(seata)