绕过conntrack,使用eBPF增强 IPVS优化K8s网络性能
chain • Pros • Iptables is widely adopted in popular Linux distributions • Cons • O(N^2) in control plane / O(N) in data plane • Poor in scheduling algorithm • Iptables rules are difficult to debug IPVS mode • Services are organized in hash table • IPVS DNAT • conntrack/iptables SNAT • Pros • O(1) time complexity in control/data plane • Stably runs for two decades • Support rich scheduling from local-in to PREROUTING • The challenges • Skb’s pointer to route is NULL during PREROUTING • No de-fragment is done during PREROUTING IPVS bypass conntrack (con.) • Egress • Original way • Nf local-out0 码力 | 24 页 | 1.90 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战
• cudaAddressModeBorder :超出范围就用零代替 • 示意: 00 | ABCDE | 00 • cudaAddressModeWrap :重叠模式(循环) • 示意: DE | ABCDE | AB • cudaAddressModeMirror :镜像模式 • 示意: BA | ABCDE | ED CUDA 纹理对象:封装 • 其中 cudaTextureFilterMode 上式对时间求导,即 d(div v)/dt = div dv/dt = 0 ;带入 dv/dt = -p 得 div grad p = 0 。 • 因此为了模拟不可压缩流我们要求保证 p 满足 div grad p = 0 ? • 不妨假设现在 div v ≠ 0 ,然后想办法如何通过修正压强来消除他,即让 div grad p = -div v 。 • 因此为了模拟不可压缩流我们要求解压强的泊松方程!泊松方程的右边就是负的速度散度 中查看导出的结果 边界条件 边界条件:初始化 边界条件:添加判断边界的版本 边界条件:仅在第一层额外判断边界条件 进一步改进 VDB 导出:支持导出多个网格,并指定名称 进一步改进 VDB 导出: P-IMPL 模式 进一步改进 VDB 导出: F-IMPL 模式 Blender 渲染结果 改进 改进边界条件:外部边界流出而不是反弹,内部边界可以流出速度 Blender 中调整一下材质0 码力 | 58 页 | 14.90 MB | 1 年前3THE FIRST EXPLORATION OF PROJECT SPARROW
com/microkernel-in-operating-systems.html I. Background . Source: https://os.inf.tu-dresden.de/Studium/MkK//SS2021/01_intro.pdf Architecture & Design 1.2 L4 Overview I. Background https://en produce-technological-breakthroughs/ I. Background Source: https://zhuanlan.zhihu.com/p/367035973 1.4.2 lowRISC Overview I. Background https://lowrisc.org/ https://github.com/lowrisc0 码力 | 68 页 | 13.14 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器
那如果我确实需要让 set 迭 代器向前移动 3 格怎么办? • 可以调用三次 ++ 运算,实 现和 + 3 同样的效果。 • vector 迭代器的 + n 复杂度 是 O(1) 。而 set 迭代器模 拟出来的 + n 复杂度为 O(n) 。虽然低效,但至少可 以用了。 std::next 等价于 + • 但是这样手写三个 ++ 太麻烦了 ,而且是就地操作,会改变迭代 器本身。 • 因此标准库提供了 语言指针( 2 ) • 上节课说了,迭代器就是在模仿 C 语言指针。 • 回想一下 C 语言咋遍历数组的: • int arr[n]; • for (int *p = arr; p < arr + n; p++) { • int value = *p; • } • 索性用 arr + i 作为迭代的变量,避免一次加法的开销。 • 循环的范围变成 [arr, arr + n) 。 复习 C 语言指针( 回想一下 C 语言咋遍历数组的: • int arr[n]; • for (int *p = arr; p != arr + n; p++) { • int value = *p; • } • n 总是大于 0 的。 p 的初值 arr 总是小于末值 arr + n ,所以把 p < arr + n 改成 p != arr + n 是一样的,还高 效一点。 复习 C 语言指针( 4 ) •0 码力 | 83 页 | 10.23 MB | 1 年前3Zadig 产品使用手册
代 已 然 到 来 。 Z a d i g 软 件 工 程 平 台 是 国 内 落 地 程 度 最 深 、 使 用 范 围 最 广 ( 近 千 家 企 业 ) 的 云 原 生 D e v O p s 平 台 。 领先企业抢先实践 Zadig Zadig 研发数字化转型方案正成为产业数字化战略的核心环节 Zadig 设计思路:通过「平台工程」解决流程挑战,通过「技术升级」提升组织效能 C T 针 对 全 流 程 ) • 持 续 安 全 ( C S 针 对 全 流 程 ) • 持 续 运 营 ( C O 针 对 全 流 程 ) 涉 及 角 色 : • 开 发 • 测 试 • 业 务 运 维 平 台 建 设 方 : • D e v O p s / 平 台 运 维 • I T / 基 础 设 施 • 测 试 / 安 全 团 队 持续测试 (Continuous 持续测试 CT/ 持续安全 CS 协 同 特 点 : • 流 程 可 定 义 • 工 具 可 扩 展 • 能 力 可 编 排 • 价 值 可 感 知 面 向 角 色 : • P O / T O • 开 发 • 测 试 • 运 维 服 务 编 排 : • 测 试 服 务 • I T 服 务 • 安 全 服 务 Zadig 产研协同方案: 自动化一切可以自动化的,让工程师专注创造0 码力 | 52 页 | 22.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
“hello” 也是个语法糖,他等价于数组 {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, 0} 。 C 语言字符串的特点 • 正如 ‘ h’ 是个语法糖,等价于 h 的 ASCII 码——整数 104 。 • “hello” 也是个语法糖,他等价于数组 {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, 0} 。 • hello 每个字符都连续地排列在这个数组中,那么末尾的 。 • 例如 “ helloworld”.rfind(‘l’) 会返回 8 ,因为 rfind 是优先 从尾部开始查找的。 • rfind 和 find 的最坏复杂度都为 O(n) ,最好复杂度都为 O(1) 。 find_first_of 寻找集合内任意字符 • size_t find_first_of(string const &s, size_t pos = 0) const vector 的 insert 一 样)。这意味着 replace 最坏是 O(n) 复杂度的,然而如果原来的子字 符串和新的子字符串一样长度,例如 “ helloworld”.replace(4, 2, “pf”) 会 得到 “ helpfworld” 则后面的 “ world” 不需要被平移,是最好的 O(1) 复 杂度……好吧,其实是 O(len) 复杂度, len 就是这里子字符串的长度 2 。 •0 码力 | 162 页 | 40.20 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector
会返回指向数组中首个元素的指针, 也就是等价于 &a[0] 。由于 vector 是连续 存储的数组,因此只要得到了首地址,下一 个元素的地址只需指针 +1 即可。 • 因为指针的 p[i] 相当于 *(p + i) ,因此可以 把 data() 返回的首地址指针当一个数组来 访问。 • int *data() noexcept; • int const *data() const noexcept; 迭代器的自增运算符分为 ++p 和 p++ 两种写法。 • 他们都会产生 p = p + 1 的效果,但是有一个细微的 区别,就是他们被作为表达式时的返回值。 • ++p 会返回自增后的值 p + 1 ,这和 p += 1 完全一 样,同样因为返回的是一个左值引用所以还可以继续 自增比如 ++++p 。 • p++ 会返回自增前的值 p ,但是执行完以后 p 却又 是 p + 1 了,非常迷惑) 中我推荐尽可能地多用前置自增 ++p 。 在运算符重载上,沙雕的 C++ 标准 委员会规定, operator++(int) 这个重 载是后置自增 p++ ,不带任何参数的 operator++() 这个重载是前置自增, 之所以这样是因为同名函数只能通过 参数列表类型来区分,这个 int 类型 参数没有任何实际意义,只是为了区 分不同的重载……编译器会在 p++ 的 时候自动改成调用 p.operator++(0)0 码力 | 90 页 | 4.93 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
C++17 引入常用数值算法 未来: C++20 引入区间( ranges ) https://zhuanlan.zhihu.com/p/350068132 未来: C++20 引入模块( module ) https://zhuanlan.zhihu.com/p/350136757 未来: C++20 允许函数参数为自动推断( auto ) 未来: C++20 引入协程( coroutine 中还可以有多个参数,甚至能用 = 。 • 除了不能用 () 之外,和函数局部变量的定义方式 基本等价。 • 顺便一提: • int x{}; • void *p{}; • 与 • int x{0}; • void *p{nullptr}; • 等价,都会零初始化。但是你不写那个空括号就会 变成内存中随机的值。 • 再比如: std::cout << int{}; 会打印出 0 造函数,那么您必须同时定义或删除拷贝 赋值函数,否则出错。” C++11 :为什么区分拷贝和移动? • 有时候,我们需要把一个对象 v2 移动到 v1 上。而不需要涉及实际数据的拷贝。 • 时间复杂度:移动是 O(1) ,拷贝是 O(n) 。 • 我们可以用 std::move 实现移动。 • v2 被移动到 v1 后,原来的 v2 会被清 空,因此仅当 v2 再也用不到时才用移动 。 v2 的内容被移走,所以只剩0 码力 | 96 页 | 16.28 MB | 1 年前3C++20 STL Features: 1 Year of Development on GitHub
Algorithms: • P0202R3 constexprAnd exchange() (GH-425) • P0879R0 constexpr Algorithms, Part II (GH-425, BillyONeal) • P1645R1 constexpr Algorithms (GH-399, Neargye) • More: • P0415R1 Neargye) • P0595R2 is_constant_evaluated() (GH-353, Jennifer Yao – MSVC compiler) • P1006R1 constexpr pointer_to() (GH-397, AdamBucior) • P1023R0 constexpr array Comparisons (GH-599, Weheineman) • P1032R1 miscco) • P1065R2 constexpr INVOKE (GH-703, AdamBucior) • Work in progress (mnatsuhara): • GH-37 P0784R7 Library Support For More constexpr Containers • GH-43 P0980R1 constexpr string • GH-45 P1004R2 constexpr 0 码力 | 45 页 | 702.09 KB | 5 月前3C++20: An (Almost) Complete Overview
Coroutines What are coroutines used for? They simplify implementing: Generators Asynchronous I/O Lazy computations Event driven applications17 Coroutines C++20 contains language additions familiar template syntax with lambda expressions [](T x) { /* ... */ } [] (T* p) { /* ... */ } [] (T (&a)[N]) { /* ... */ }28 Templated Lambda Expressions Motivation shared_ptr p; }; auto find(T t) const { auto p = head.load(); // C++11: atomic_load(&head) while (p && p->t != t) p = p->next; return reference(move(p)); } auto 0 码力 | 85 页 | 512.18 KB | 5 月前3
共 42 条
- 1
- 2
- 3
- 4
- 5