绕过conntrack,使用eBPF增强 IPVS优化K8s网络性能(kenieevan@github) Zhiguohong (honkiko@github) Bypassing conntrack: Optimizing K8s Service By Enhancing IPVS with eBPF Agenda 目录 01 Problems with K8s Service How to optimize 02 Comparison with industry Performance Performance measurement 03 04 Future work 05 06 Lessons from eBPF What is K8s Service • It exposes a set of pods via VIP using a load balancer • Two types • ClusterIP provides in-cluster access •0 码力 | 24 页 | 1.90 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台开 发 者 场 景 挖 掘 3-5 个领域敏感型场景 建立产品发展委员会 贡献者流程优化 2022 年 9 月 场 景 深 化 能 力 增 强 Helm/K8s YAML/ 托管场景接入流程优化 UX/UI 升级,工程师一线体验优化 推出效能看板,实时客观度量工程数据指标 效 率 优 化 、 开 发 者 体 验 增 强 2023 年 面向生态伙伴开放场景 面向开发者提供 IDE 流程自动化 特色模块(二) – 客户交付 供应商产品生命周期管理 为客户提供生命周期管理 管理不同渠道的版本 可部署到任何环境 简 化 对 客 户 的 本 地 、 私 有 云 、 离 线 环 境 的 产 品 发 布 、 许 可 和 支 持 的 管 理 产品各版本功能差异 基础版注重工程师体验,专家版保障稳定可靠高效发布;企业版安全发布、数据运营及企业扩展定制 3 Zadig 平台工程模式及 上 的 其 他 产 品 基 本 没 办 法 解 决 微 服 务 联 调 的 问 题 … 大 家 一 般 进 入 统 一 的 环 境 里 自 测 , 但 通 常 只 会 测 试 能 想 到 的 点 , K o d e R o v e r 用 自 动 化 的 方 式 让 大 家 测 得 更 全 面 , 把 事 情 做 的 质 量 提 高 , 提 升 了 测 试 的 覆 盖 度 。 可 以 说 ,0 码力 | 59 页 | 81.43 MB | 1 年前3
谈谈MYSQL那点事查询缓存区的最大长度,按照当前需求,一 倍一倍增加,本选项比较重要 sort_buffer_size 512K 128M 每个线程的排序缓存大小,一般按照内存可 以设置为 2M 以上,推荐是 16M ,该选项对 排序 order by , group by 起作用 record_buffer 128K 64M 每个进行一个顺序扫描的线程为其扫描的每 张表分配这个大小的一个缓冲区,可以设置 为 2M 以上 选项 缺省值 推荐值 说明 key_buffer_size 8M 512M 用来存放索引区块的缓存值 , 建议 128M 以上,不要大于内存的 30% read_buffer_size 128K 64M 用来做 MyISAM 表全表扫描的缓冲大 小 . 为从数据表顺序读取数据的读操 作保留的缓存区的长度 myisam_sort_buffer_size 16M 128M 设置 , 恢复 , 修改表的时候使用的缓冲 ,官方推荐是 innodb_buffer_pool_size 的 40-50%, 设置大 一点来避免在日志文件覆写上不必要的缓冲池刷新 行为 innodb_log_buffer_size 128K 64M 用来缓冲日志数据的缓冲区的大小 . 推荐是 8M , 官方推荐该值小于 16M ,最好是 1M-8M 之间 设计合理的数据表结构:适当的数据冗余 设计合理的数据表结构:适当的数据冗余0 码力 | 38 页 | 2.04 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程下载完成前,整个界面都会处于“未响应”状 态,用户想做别的事情就做不了。 现代 C++ 中的多线程: std::thread • C++11 开始,为多线程提供了语言级别的 支持。他用 std::thread 这个类来表示线 程。 • std::thread 构造函数的参数可以是任意 lambda 表达式。 • 当那个线程启动时,就会执行这个 lambda 里的内容。 • 这样就可以一边和用户交互,一边在另一 对象移动到一个全局变量去, 从而延长其生命周期到 myfunc 函数体外 。 • 这样就可以等下载完再退出了。 main 函数退出后自动 join 全部线程 • 但是需要在 main 里面手动 join 全部线 程还是有点麻烦,我们可以自定义一个类 ThreadPool ,并用他创建一个全局变量, 其解构函数会在 main 退出后自动调用。 std::jthread :符合 RAII 思想,解构时自动 func 里的 unlock() 永远得不到调用。 解决 1 : other 里不要再上锁 • 遇到这种情况最好是把 other 里的 lock() 去掉,并在其文档中说明:“ other 不是线 程安全的,调用本函数之前需要保证某 mutex 已经上锁。” 解决 2 :改用 std::recursive_mutex • 如果实在不能改的话,可以用 std::recursive_mutex0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程访问他的第 i 个元素。 • 然后因为我们用的统一内存 (managed) , 所以同步以后 CPU 也可以直接读取。 多个线程,并行地给数组赋值 • 刚刚的 for 循环是串行的,我们可以把线 程数量调为 n ,然后用 threadIdx.x 作为 i 索引。这样就实现了,每个线程负责给数 组中一个元素的赋值。 小技巧:网格跨步循环( grid-stride loop ) • 无论调用者指定了多少个线程 cudaDeviceSynchronize() 以后才真正完 成执行,才能算出真的时间。 • 查看结果,发现 GPU 比 CPU 快了很多 ,这是当然的。 调整参数 • 适当调整板块数量 gridDim 和每板块的线 程数量 blockDim ,还可以更快一些。 • 顺便一提,这样的数学函数还有 sqrtf , rsqrtf , cbrtf , rcbrtf , powf , si nf , cosf , —— 王鑫 磊 避免线程组产生分歧 • 解决:我们加 if 的初衷是为了节省不必要 的运算用的,然而对于 j < 32 以下那几个 并没有节省运算(因为分支是按 32 个线 程一组的),反而增加了分歧需要避免副 作用的开销。因此可以把 j < 32 以下的那 几个赋值合并为一个,这样反而快。 使用网格跨步循环一次读取多个 arr 元素 • 可见共享内存中做求和开销还是有点大,之后那么0 码力 | 142 页 | 13.52 MB | 1 年前3
CeresDB Rust 生产实践 任春韶CeresDB 开始研 发 2023.6 1.2.2 版本发布 优化了写入性能 优化了分布式方案 CeresDB – 目标 解决时间线高基数问题 • 能高效处理好 APM 型时序数据 • 同时能高效处理好高基数时间线场景 提供原生分布式方案 • 大规模部署 • 提供高可用、高可靠的服务 • 支持水平扩容 • 支持高效的分布式查询 - Tokio Preemption0 码力 | 22 页 | 6.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming才能让我的程序变成无分支的呢?那就来 看本期性能优化专题课吧! 分支预测成败对性能的影响 排序为什么对有分支的版本影响那么大 为什么需要流水线 • 为了高效, CPU 的内部其实是一个流水 线 (pipeline) 。流水线的目的是能把原本 串行的一系列指令并行化。为了理解为什 么需要流水线,我们先反过来,假设没有 流水线,会有什么坏处。 • 例如,右边你今天早上的任务清单。 • 。 • 同一段程序被多次执行后,如果每次都是分支 A ,下一次 CPU 就会总结经验,预判到下 一次应该也是分支 A ,并且把 90% 的流水线用于预先执行分支 A 的剧本, 10% 的流水 线用于预先执行分支 B 。如果预判成功,的确走了分支 A ,那么只会浪费 10% 的算力; 如果预判失败,最后走了分支 B ,那就不得不把预先执行分支 A 的数据全部删了,浪费 90% 的算力。这就是0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅度算法,轮换着执行着不同的线程,看起来 就好像是同时运行一样,其实每一时刻只有 一个线程在运行。目的:异步地处理多个不 同的任务,避免同步造成的阻塞。 • 并行:多核处理器,每个处理器执行一个线 程,真正的同时运行。目的:将一个任务分 派到多个核上,从而更快完成任务。 举个例子 • 并发:某互联网公司购置了一台单核处理 器的服务器,他正同时处理 4 个 HTTP 请求,如果是单线程的0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器// 写入键值为 “ key” 的元素,如果不存在,抛出异常 • 毕竟 [] 和 at() 只是返回引用,不管你是读取还是写入这个引用,函数本身的特性是不变的。 • 唯一的区别是等号在他后面,是往 K 对应的 V 里赋值。 • [] 创建在先, = 写入在后。成功写入了新建的元素。 • at 报错在先, = 写入在后。结果是报错了,没有写入。 写入 map 元素 • mapK, V>::value_type 是 pair K, V> 。 • 这很合理,虽然只针对 K 排序,但实际上 K 和 V 是捆绑在一起的。 • pair<K, V> 就是这样一个结构,前 K 后 V ,在内存中也是紧挨着。 k k k k k k k k k k k k v v v v v v set<K> map<K, V> map map 的元素类型是…… • pair K, V> 。 • 可是为什么要用 const K 呢?上节课说了, set 里面的 K 不能改变!一旦改变就会破坏 好不容易排好的顺序,以后再用二分法 find 就找不准了,所以 set 实际上只有 const_iterator 。 • 但是 map 只针对 K 进行排序, V 又不参与排序,完全可以随意改变。因此 C++ 之父 允许 map 0 码力 | 90 页 | 8.76 MB | 1 年前3
Автоматизация управления ClickHouse-кластерами в KubernetesАвтоматизация управления ClickHouse-кластерами в Kubernetes Владислав Клименко и Валерий Панов K8s? Что это? K8s is the new Linux Это платформа с открытым кодом. позволяющая: • строить системы на основе запросов (OLAP), с открытым кодом. Зачем ClickHouse в Kubernetes? • Все компоненты системы уже в k8s. • Максимальная унификация управления. • Нужно быстро строить хранилища данных. • Нужна максимальная Лицензия: Apache 2.0, Распространяется как Docker image ClickHouse cluster resources kubectl apply K8S API Спецификация ClickHouse on Kubernetes – components Shard 1 Replica 1 Zookeeper Services0 码力 | 44 页 | 2.24 MB | 1 年前3
共 25 条
- 1
- 2
- 3













