c++性能调优,可能的情况
# 通用设置
隔核绑核、 不跨numa、 numa_balancing、 网络preload、 冷、 大页、 nohz、 增大tcp缓冲区
nohz、CONFIG_HZ、内核的时间片调度中断:
CONFIG_NO_HZ_FULL=y # Kconfig
nohz=on
nohz_full=1,6-8
1
2
3
2
3
- https://www.zhihu.com/question/21674968 (opens new window)
- https://www.e-learn.cn/topic/3787602 (opens new window)
- https://www.wenjiangs.com/doc/ucgeyuyt (opens new window)
# 特殊情况
有些库的rand随机数函数可能用了lock;
频繁大量申请和释放内存,shared_pointer;
blas库有好几种,openblas、blas等,有的是多线程版本的,有的是单线程的。用户代码是多线程的,一个核一个线程,此时再用多线程版本的blas库就会很慢,要用单线程的。
solarflare efvi poll的时候可尝试一次poll多个包
solarflare onload进行tcp收发包时,如果一个线程收包,另一个线程发包,并且收包线程如果循环非阻塞(NON_BLOCK)收取,则会对发包延迟产生影响,发包耗时增加约200-300ns
asio通过async_receive_from异步收udp包,或者async_read异步收tcp包时,会因为队列造成约300n延迟(智能网卡条件下)。用receive_from直接同步non_block收包,即可消除该延迟。
unsigned short port = 55555;
boost::asio::io_service iosrv;
boost::asio::ip::udp::socket udp_socket(iosrv);
boost::asio::ip::udp::endpoint ep;
boost::system::error_code errcode;
char recvbuf[1024];
udp_socket.non_blocking(true);
while(1) {
int recvlen = udp_socket.receive_from(boost::asio::buffer(recvbuf, sizeof(recvbuf)), ep, 0, errcode);
if(recvlen==0) continue;
printf("received data, recvlen=%d\n", recvlen);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编译选项
链接优化 -flto
gcc attribute 属性
__attribute__((always_inline))
//参考 https://zhuanlan.zhihu.com/p/335327104
__attribute__((hot))
__attribute__((always_inline)) int funA() {
printf("aaa");
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54