摘要:在开发DPDK应用的时候,我们可以通过rte_eth_stats_get函数获取网卡统计信息中的imissed计数来判断网卡是否出现丢包。 2.分析 一个网络帧从网卡接收到被应用处理,中间主要需要经历两个阶段,我们分别从这两个阶段进行分析。 阶段一:网卡通过其DMA硬件将收到的报文写入到收包队列中,
阅读全文
摘要:rte_pktmbuf_pool_create: mmempool create 的时候调用设置mempool obj的cookie static void mempool_add_elem(struct rte_mempool *mp, void *obj, phys_addr_t physadd
阅读全文
摘要:稳定复现的 coredump打开 dpdk 相关的 debug开关,重新编译mbuf debugmalloc debug mempool debug给 dpdk 源码加检查或日志,重新编译无法稳定复现的 coredump打开大页内存的 coredump案例字节序导致取地址不对,从而踩内存多线程竞争资
阅读全文
摘要:在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态,首先看一下该函数的声明: // 函数声明(dpdk-stable-19.11.3/lib/librte_ethdev/rte_ethdev.h) int rte_eth_stats_get(uint1
阅读全文
摘要:https://www.yuque.com/zzqcn/opensource/ohog87 https://www.yuque.com/taohuaban/fc6dp0/clxhrb
阅读全文
摘要:#ifndef __SPIN_LOCK__ #define __SPIN_LOCK__ typedef struct { volatile int locked; /**< lock status 0 = unlocked, 1 = locked */ } rte_spinlock_t; void
阅读全文
摘要:typedef struct { volatile int32_t cnt; /**< -1 when W lock held, > 0 when R locks held. */ } rte_rwlock_t; dpdk在实现读写锁的时候,使用了原子锁机制读锁加锁的时候,判断cnt是否小于0,如果
阅读全文
摘要:1. MTU 的概念 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议在某一层上面所能通过的最大数据报大小(以字节为单位),它通常与链路层协议有密切的关系。 由于以太网传输电气方面的限制,每个以太网帧都有最小的大小 64bytes,最大不能超过 1518by
阅读全文
摘要:lvs Linux Virtual Server (lvs) 是Linux内核自带的负载均衡器,也是目前性能最好的软件负载均衡器之一。lvs包括ipvs内核模块和ipvsadm用户空间命令行工具两部分。 在lvs中,节点分为Director Server和Real Server两个角色,其中Dire
阅读全文
摘要:发送 /* Transmit DMA registers */ #define IXGBE_TDBAL(_i) (0x06000 + ((_i) * 0x40)) /* 32 of them (0-31)*/ #define IXGBE_TDBAH(_i) (0x06004 + ((_i) * 0x
阅读全文
摘要:#include <iostream> #include <utility> #include <thread> #include <chrono> #include <functional> #include <atomic> #include <vector> using namespace s
阅读全文
摘要:root@ubuntu:~/cmd# perf stat -a -e L1-dcache-load-misses,L1-icache-load-misses -p 206 -- sleep 5 Performance counter stats for process id '206': 114,2
阅读全文
摘要:原理 TLB(Translation lookaside buffer)为页表(存放虚拟地址的页地址和物理地址的页地址的映射关系)在CPU内部的高速缓存。TLB的命中率越高,页表查询性能就越好。 TLB的一行为一个页的映射关系,也就是管理了一个页大小的内存: TLB管理的内存大小 = TLB行数 x
阅读全文
摘要:#include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { int a[1000][1000]; if(1 == argc) { for(int i = 0; i < 1000; ++i) { for(int j
阅读全文
摘要:1. 为什么调用pthread_cond_wait之前需要检查条件 在线程调用 pthread_cond_signal() 之前,如果没有线程调用 pthread_cond_wait() 处于阻塞状态,那么什么都不会发生; 在线程调用 pthread_cond_signal() 之后,线程调用了 p
阅读全文
摘要:处理 SIGPIPE 在网络编程中经常会遇到SIGPIPE信号,默认情况下这个信号会终止整个进程,当然你并不想让进程被SIGPIPE信号杀死。我们不禁会这样思考: 在什么场景下会产生SIGPIPE信号? 要怎样处理SIGPIPE信号? SIGPIPE产生的原因是这样的:如果一个 socket 在接收
阅读全文
摘要:如果我们在调用accept函数返回之前, 该客户端TCP发送了一个RST(复位)。在服务器中, 表现为该连接仍在TCP队列中, 等待服务器进程调用accept的时候RST到达。此时返回的套接字是一个已连接,但是却有接受了RST的套接字。 模型图如下: #include <stdio.h> #incl
阅读全文
摘要:1、前言 昨天总结了一下Linux下网络编程“惊群”现象,给出Nginx处理惊群的方法,使用互斥锁。为例发挥多核的优势,目前常见的网络编程模型就是多进程或多线程,根据accpet的位置,分为如下场景: (1)单进程或线程创建socket,并进行listen和accept,接收到连接后创建进程和线程处
阅读全文
摘要:#include <iostream> #include <memory> #include <thread> #include <chrono> #include <mutex> struct Test { Test() { std::cout << " Test::Test()\n"; } ~T
阅读全文
摘要:weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用计数的增加或减少。没有重载 *和 -> 但可以使用lock获得一个可用的shared_ptr对象 weak_pt
阅读全文
摘要:Rvalue Reference 右值引用 当赋值操作的右边是右值(rvalue),左边的对象不需要特意分配内存去存放这个拷贝(copy),而可以搬移(move)右边对象的资源。 用于解决不必要的拷贝和实现完美转发(perfect forwarding)。 Move Semantics 移动语义 m
阅读全文
摘要:C++ map容器插入具有相同键的键值对的覆盖问题 map容器插入键值对的方法一般有两种 map["key"] = value; map.insert(make_pair<>("", "")); #include <map> #include <iostream> using namespace s
阅读全文
摘要:原文地址: https://mp.weixin.qq.com/s/G8tnIVjjMJhdReXTpa_C0g 本文以无线接入网为线索,梳理一下无线侧接入网+承载网+核心网的架构,主讲无线接入网,浅析承载网和核心网,帮助大家更深入的了解5G,也帮助新手更好的入门。 在我们正式讲解之前,我想通过这张网
阅读全文
摘要:RCU概念 ReadCopy Update (RCU) 是Linux的一种同步机制,把写数据看成一个update操作,可分为两个阶段removal和reclamation。removal阶段将旧数据的指针替换为新数据的指针,可以与 reader 并发,reclamation阶段在等待旧数据的读操作完
阅读全文
摘要:https://gitlab.informatik.uni-halle.de/acwuz/proto-quic-honeypot/-/tree/b25a794403c61acbf86e1e6b9e0629f0fc3c1959/src/net/quic/quartc // Copyright (c)
阅读全文
摘要:atomic_fetch_and emplate (integral) (1) template <class T> T atomic_fetch_and (volatile atomic<T>* obj, T val) noexcept; template <class T> T atomic_f
阅读全文
摘要:map默认是按key值从小到大排序的 按value值排序: 想直接用sort排序是做不到的,sort只支持数组、vetctor等的排序,所以我们可以先把map装进pair里,然后再放入vector,自定义sort实现排序 假设已有一组map<string,int>类型的数mp,则具体实现过程为: v
阅读全文
摘要:#include <iostream> #include <thread> int main() { int id = 9; std::thread t([&id](){ std::cout << "thread function and id " << id << std::endl; }); s
阅读全文
摘要:一. 前言 本文总结std库中unsorted_map和map的区别。 二. 区别示意图map unordered_mapOrdering increasing order ( by default ) no orderingImplementation Self balancing BST ( l
阅读全文
摘要:QuicWrite (gdb) bt #0 posix_quic::QuicStreamEntry::Writev (this=this@entry=0x84cee0, iov=iov@entry=0xffffffff8fe8, iov_count=iov_count@entry=1, fin=fi
阅读全文
摘要:F0413 10:14:37.638090 212601 certmanager.go:91] Error: failed to get edge certificate from the cloudcore, error: Get "https://10.10.xx.x2:10002/edge.c
阅读全文
摘要:Kubernetes 已经成为云原生的标准,并且能够在任何基础设施上提供一致的云上体验。我们经常能够看到“容器 + Kubernetes”的组合在 DevOps 发挥 10X 效率,最近也有越来越多 Kubernetes 运行在数据中心外(边缘)的需求。 如果要在边缘部署较复杂的应用,那么 Kube
阅读全文
摘要:并发编程作为 C++11 系列的一个重大更新部分,值得我们去探究,并应用其提升程序的性能。本系列参考了其他一些文章,对 C++11 并发编程的一些要点进行了总结,并给出一些示例。 condition_variable 类介绍 std::condition_variable 是 C++11 多线程编程
阅读全文
摘要:gdb) bt #0 posix_quic::Event::Trigger (event=4, this=0x839080) at /root/posix_quic/src/event.cpp:55 #1 posix_quic::Event::SetWritable (this=this@entry
阅读全文
摘要:隧道( tunnel )模式 隧道( tunnel )模式:隧道模式保护所有 IP 数据并封装新的 IP 头部,不使用原始 IP 头部进行路由。在 IPSec 头部( ESP 或 AH )前加入新的 IP 头部,源 IP 地址和目的 IP 地址为 IPSec peer 地址。并允许 RFC 1918
阅读全文
摘要:在经过二十多年的发展后,TCP/IP协议(诞生于1983年)早已不适应现在的网络环境和复杂应用。实际上,业界对TCP/IP协议的各种修补和优化时 间也不算短了,还诞生了不少专门做这件事情的公司。而对于专注在应用交付网络领域的F5来说,如何看待 TCP协议优化方面的问题呢?对此,F5中国区技术总监吴静
阅读全文
摘要:git查看tag git查看tag命令: ershixiongdeMacBook-Pro:spring-boot zzs$ git tag v2.2.0.M1 v2.2.0.M2 v2.2.0.M3 v2.2.0.M4 v2.2.0.M5 v2.2.0.M6 v2.2.0.RC1 v2.2.0.RE
阅读全文
摘要:root@ubuntu:~/cmd# kubeadm alpha certs check-expiration [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can l
阅读全文
摘要:安装docker systemctl enable docker && systemctl start docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyun
阅读全文
摘要:Linux 的虚拟内存管理有几个关键概念: 每个进程有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址 虚拟地址可通过每个进程上页表与物理地址进行映射,获得真正物理地址 如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则
阅读全文
摘要:从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk 和 mmap(不考虑共享内存)。 brk 的实现方式是将 Data Segment 的最高地址指针 _edata 往高地址推(分配的内存小于 128k )。 mmap 的实现方式是在 Memory Mapping Segme
阅读全文
摘要:kubeedge 组件 Edged:一个运行在 edge 节点的 agent 程序,管理边缘的容器化应用程序 EdgeHub:边缘的通信接口模块。这是一个 Web 套接字客户端,负责边缘计算与云服务的交互。包括同步云端资源到边缘端,以及报告边缘端 host 和 device 状态到云端 CloudH
阅读全文
摘要:背景 平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少。在看并发编程,这里总结一下。方便后续使用。 std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。 std::lock_guard std:
阅读全文
摘要:root@ubuntu:~/reading-and-annotate-quic/libquic-client-server-example/libquic/build# cmake .. CMake Error: The current CMakeCache.txt directory /root/
阅读全文
摘要:总结: 1.不要对临时变量进行改变。要传递临时变量,得用常量引用。 2. 当引用不需要更改时,用const引用。 问题: struct Sales_data { Sales_data() = default; Sales_data(std::string &str){} Sales_data& co
阅读全文
摘要:#include <iostream> #include <future> #include <thread> using namespace std; class Person { public: Person(int v) { value = v; std::cout << "Cons" <<v
阅读全文
摘要:1、shared_ptr共享智能指针 std::shared_ptr使用引用计数,每个shared_ptr的拷贝都指向相同的内存,在最后一个shared_ptr析构的时候,内存才会释放。 1.1 基本用法 1.1.1 初始化 shared_ptr可以通过make_shared来初始化,也可以通过sh
阅读全文
摘要:enum QuicFrameType { PADDING_FRAME = 0, RST_STREAM_FRAME = 1, CONNECTION_CLOSE_FRAME = 2, GOAWAY_FRAME = 3, WINDOW_UPDATE_FRAME = 4, BLOCKED_FRAME = 5
阅读全文
摘要:root@ubuntu:~/c++# cat /proc/sys/net/ipv4/tcp_mtu_probing 0 root@ubuntu:~/c++# int val = 1; setsockopt(sd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val))
阅读全文
摘要:Linux ICMP消息的产生与转换 ICMP在IP系统间传递差错和管理报文,是任何IP系统必须实现的组成部分。Linux 2.6.34中ICMP模块的实现在linux/icmp.h,net/icmp.h和ipv4/icmp.c中,导出了icmp_err_convert数组和icmp_send函数,
阅读全文
摘要:Linux 内核关于 MSS 实现的细节 Linux 内核在tcp_sock这个数据结构中保存与 MSS 有关的信息。 struct tcp_sock{ // code omitted struct tcp_options_received rx_opt; { // code omitted...
阅读全文
摘要:override 关键字 作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。 使用以后有以下好处:1.可以当注释用,方便阅读.2.告诉阅读你代码的人,这是方法的复写.3.编译器可以给你验证 o
阅读全文
摘要:#include <iostream> #include <unordered_set> int main() { std::unordered_set<int> X { 2020, 2019, 2018 }; X.insert(19); X.insert(99); X.insert(89); X.
阅读全文
摘要:Lambda 表达式不仅具有函数指针的灵活性,还可以通过捕获局部变量提高可扩展性。本文介绍 Lambda 表达式的语法和用法。 简介 Lambda 可能是最新的 C++11 标准的典型特性之一。Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参
阅读全文
摘要:QUIC实现代码分析 文件介绍 quic_connection类文件主要编写QuicConnection类,该类是quic服务端和客户端的处理框架,它提供SendStreamData方法用来发送流数据,被QuicSession调用。 它使用QuicPacketGenerator来创建Quic帧。 而
阅读全文