
高性能编程
文章平均质量分 78
高性能编程
大隐隐于野
这个作者很懒,什么都没留下…
展开
-
编译器调优手段
编译器优化选项能够在编译阶段完成代码的优化,下面列举了常用的优化编译选项及其优化原理,在一些场景下能够大幅提高程序的运行性能。原创 2025-04-27 17:50:33 · 1084 阅读 · 0 评论 -
io500性能优化经验
与Top500榜单相对平稳的排名和趋势相比,IO500榜单的竞争显得异常激烈。其中,10节点榜单将由于更接近于实际并行程序可能达到的规模,更能反映存储系统可为实际程序提供的I/O性能,参考价值更高。IO500包括带宽和元数据两项基准测试,将两个项目的总分进行几何平均后,得出最终分数。Top500是针对计算系统性能排名,而IO500主要针对存储系统性能进行排名,是高性能计算领域最权威的全球性榜单之一。自2017年11月开始,每年在美国的SC和德国的ISC大会上各公布一次IO500榜单。原创 2025-03-26 14:15:38 · 201 阅读 · 0 评论 -
cpu_layout
import systry:cores = []fd.close()try:continueexcept:breakfd.close()fd.close()print("")else:原创 2025-03-05 16:33:04 · 295 阅读 · 0 评论 -
Scatter Gather List (SGL)
最后一个SGL段是不包含SGL段描述符或SGL末段描述符的SGL段。•SGL数据块描述符包含地址或长度字段,其中两个较低的位任一设置为1b,控制器只支持标识控制器数据结构中的SGL Support字段中所示的Dword对齐和粒度。设置为全零的SGL描述符是地址字段设置为00000000_00000000h且长度字段设置为00000000h的SGL数据块描述符可以用作NULL描述符。•SGL段除了段中的最后一个描述符外,还包含SGL段描述符或SGL最后一个段描述符;一个SGL段包含一个或多个SGL描述符。原创 2025-02-13 14:16:31 · 342 阅读 · 0 评论 -
linux io按照写入量排序
使用lsof列出打开的文件:获取正在写入的文件列表。使用iotop或pidstat监控写入量:根据进程监控I/O操作。结合awksort等工具处理数据:提取并排序写入量信息。原创 2025-02-11 11:18:45 · 384 阅读 · 0 评论 -
fio disable advise
【代码】fio disable advise。原创 2025-02-10 15:46:05 · 91 阅读 · 0 评论 -
查看网卡所在numa
在多处理器系统中,特别是使用 NUMA(Non-Uniform Memory Access)架构的服务器中,了解网卡所在的 NUMA 节点可以帮助优化网络和应用程序的性能。原创 2025-01-22 16:08:13 · 786 阅读 · 0 评论 -
常用性能分析工具
需要注意的是,在同步 (SYNC) IO 模式下,slat 并不计算,这是因为同步 IO 的这两个时间非常接近,没有计算意义。虽然可以拿到单次系统调用读写的字节数,但对大量的 IO 请求来说,不经过额外的脚本处理,很难得到一个总体的认识和分析。但是,我们可以通过编写 SystemTap 脚本来对这个测试的 IO 请求大小做一个宏观的统计,并且使用直方图来直观的呈现这个测试的文件 IO 尺寸分布。根据 strace 的跟踪日志,我们可对本次 fio 测试的 IO pattern 做一个简单的分析。原创 2025-01-17 10:46:28 · 1056 阅读 · 0 评论 -
centos使用dpdk库
在 C++ 中使用 DPDK(Data Plane Development Kit)库通常涉及到以下几个步骤:安装 DPDK、配置编译环境、编写 C++ 代码并链接 DPDK 库。以下是如何在 C++ 中引用和使用 DPDK 的详细步骤。原创 2025-01-14 17:06:46 · 967 阅读 · 0 评论 -
Performance Optimization of memcpy in DPDK
【代码】Performance Optimization of memcpy in DPDK。原创 2025-01-14 15:07:10 · 794 阅读 · 0 评论 -
iostat命令详解
iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装:注意:本文中 demo 的演示环境为 ubuntu 18.04。原创 2025-01-09 10:58:30 · 1260 阅读 · 0 评论 -
发生 SLAB 内存泄漏该怎么办
上述介绍的几种方式不一定能找出内存泄漏的根本原因, 不过会帮助我们获取一些有用的线索. 值得一提的是, 如果找到了相关的线索, 关闭对应的任务, 模块或驱动后, 内核不一定会释放这些内存, 可能只能观察到的数量不再增长, 这种情况下就只能靠重启系统释放内存.转载 2024-12-18 19:32:47 · 178 阅读 · 0 评论 -
C++中类的内存对齐
为什么占用8个字节呢?因为这个就和第一个易错点有联系了,因为现在这个类内部并没有定义有成员数据,c++用一个内存单元来表示这个实例对象的存在,这一个内存字节,因为存在虚函数表(4个字节),所以经过内存对齐之后,这个类所占用的内存大小就是8了,而不是4了。没错,在这个情况下是以4个字节作为对齐的,但是真的就是都是以4个字节作为内存对齐的标准的吗?这下懵逼了吧,现在的内存对齐的标准又变成了8个字节了,其实并不然。没错,结果并不是0而是1,这个没有定义任何成员变量也没有定义任何的虚函数的类占用的是一个字节内容。原创 2024-11-20 11:31:17 · 285 阅读 · 0 评论 -
【无标题】
非对齐内存访问在不同架构下的 CPU 上支持是不同的,目前很多 CPU 都是支持非对齐内存访问操作的,但是会牺牲部分性能,此外编译器可能对非对齐内存访问操作进行优化;而有些架构的 CPU 不能支持所有指令的非对齐内存访问操作,这时内核可能会实现对非对齐访问的处理,但是可能会发生异常错误。对于程序员来说,首先应该尽量避免非对齐内存访问,也就是不要破坏编译器对 struct 的字节补齐操作;在对指针进行强制类型转换(C风格或reinterpret_cast操作)时,需要考虑是否内存对齐,或者尽量避免上述操作。原创 2024-11-20 11:21:42 · 645 阅读 · 0 评论 -
C++中如何在指定的内存中创建新对象
在Free store或者是heap中动态创建程序所需对象时,很多人都知道,用 new 就可以了。那么如何在指定的空间中创建对象?就比如要在0x320f8该内存地址上动态创建一个int类型,怎么破?C++提供了几种特点来方便实现在预先决定的内存位置构造一个对象的任务。在这些特点中,包括一个特殊形式的new操作符,叫做操作,以及一个显式的析构处理。使用步骤在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。原创 2024-11-20 11:12:14 · 858 阅读 · 0 评论 -
Xeon Silver 4314 vs Silver 4216
322.1 GHz3.4 GHz2110 nm79 °C86 °C+++2FCLGA3647+++++++++2.02.0++++-no data++++no data++++6 TB6no data+4.048+35.7%minimum。原创 2024-10-17 17:40:47 · 1025 阅读 · 0 评论 -
Fast CRC32
链接: Fast CRC32Real life data tends to get corrupted because machines (and humans) are never as reliable as we wish for. One efficient way is make sure your data wasn't unintendedly modifiied is to generate some kind of hash. That hash shall be unique, comp原创 2024-10-15 15:48:51 · 574 阅读 · 0 评论 -
numactl 设置 numa 内存分配规则
alloc_pages_current //mm/mempolicy.c ,根据memopolicy规则,分为alloc_page_interleave和__alloc_pages_nodemask。__alloc_pages_nodemask //最终也是__alloc_pages_nodemask。vma_replace_policy //替换vm_area_struct的mempolicy。原创 2024-10-15 11:17:32 · 1331 阅读 · 0 评论 -
numa_maps使用详解
libnuma;allocated.numa_mapsis read,<node><nr_pages>includesheapstackhugedirtyandanonpages.device./procLink with-lnumalibnumaand therequired<numaif.h>numactlpackage.in thenumactl。原创 2024-10-11 15:58:26 · 1165 阅读 · 0 评论 -
TCP的粘包、拆包以及解决方案
在学习粘包之前,先纠正一下读音,很多视频教程中将“粘”读作“nián”。经过调研,个人更倾向于读“zhān bāo”。如果在百度百科上搜索“粘包”,对应的读音便是“zhān bāo”,语义解释为:网络技术术语。指TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。TCP是面向字节流的协议,就是没有界限的一串数据,本没有“包”的概念,“粘包”和“拆包”一说是为了有助于形象地理解这两种现象。原创 2024-09-13 13:59:48 · 1124 阅读 · 0 评论 -
CPU C-state & cpuidle driver
为了在CPU空闲时节约能源,可以命令CPU进入低功耗模式。C-state是intel CPU处于空闲时的一种状态,CPU有几种电源模式,它们统称为“c状态”或“c模式”低功耗模式最初是在486DX4处理器中引入的。到目前为止,已经引入了更多的功耗模式,并且对每种模式进行了增强,以使CPU在这些低功耗模式下消耗更少的功率。CPU的每个状态都使用不同的电量,并且对应用程序性能的影响也不同。原创 2024-09-12 13:07:35 · 1682 阅读 · 0 评论 -
AMD ThinkSystem服务器上的 Linux 和 C 状态设置 - Lenovo ThinkSystem
所有受支持的 Linux 发行版都使用acpi_idle cpuidle driver与列出的ThinkSystem AMD 服务器上的 CPU C 状态进行交互。因此,要禁用 Linux 上的所有 C 状态,仅在 UEFI 中关闭 C 状态是不够的。但如果 cpuidle 功能不可用,则空闲线程会尝试默认的 CPU 空闲例程,该例程特定于 CPU 架构。因此,要完全禁用 C 状态,还需要禁用默认的 CPU 空闲例程。有关 UEFI 设置选项的详细说明,请参阅所配置的特定系统的 UEFI 手册。原创 2024-09-12 13:05:19 · 1411 阅读 · 0 评论 -
优化 TCP 以提高网络性能
本页面简要介绍了计算正确设置的方法,以缩短 Google Cloud 和混合场景中 TCP 连接的延迟时间。本页面还可帮助您了解如何缩短 Google Cloud 中流程之间的连接延迟时间。现代微服务架构主张,开发者应该构建处理单一任务的小型服务。服务应根据系统的可靠性预期使用 TCP 或 UDP 进行通信。因此,确保基于微服务的系统能够可靠且低延迟地进行通信就变得至关重要。Google Cloud 通过提供来实现可靠性和低延迟,这意味着您的应用用户也可以在全球布局。拥有全球网络意味着您可以创建跨。原创 2024-09-11 15:30:34 · 1583 阅读 · 0 评论 -
dmidecode命令详解
DMI(Desktop Management Interface,DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。系统下获取有关硬件方面的信息。dmidecode 遵循 SMBIOS/DMI 标准,以一种可读的方式dump出机器的DMI(Desktop Management Interface)信息, 其输出的信息包括 BIOS、系统、主板、处理器、内存、缓存等等, 既可以得到当前的配置,也可以得到系统支持的最大配置,比如说支持的最大内存数等。原创 2024-09-11 09:52:45 · 2152 阅读 · 0 评论 -
centos7设置CPU的performance
ondemand:userspace是内核态的检测,用户态调整,效率低。cpufreq是一个动态调整cpu频率的模块,系统启动时生成文件夹 /sys/devices/system/cpu/cpu0/cpufreq/,里面有几个文件,其中scaling_min_freq代表最低频率,scaling_max_freq代表最高频率,scalin_governor代表cpu频率调整模式,用它来控制CPU频率。对于对时延和性能要求高的应用,建议关闭CPU的动态调节功能,禁止 CPU休眠,并把CPU频率固定到最高。原创 2024-09-10 11:50:55 · 867 阅读 · 0 评论 -
单机 8 个 NUMA node 如何玩转 TiDB - AMD EPYC 服务器上的 TiDB 集群最优部署拓扑探索
从测试结果可以得出,相比于绑定一个 NUMA node,将 TiKV 绑定至同一块 CPU 的两个 NUMA node 上可以获得 20% 以内的性能提升,这种部署方式适合单台服务器没有足够的磁盘来部署更多的 TiKV,如单机有 8 个 NUMA node,但只有 4 块磁盘,可以尝试单机部署 4 TiKV 实例,每实例绑定统一块 CPU 上的两个 NUMA node。在NUMA下,处理器访问它自己的本地内存的速度比非本地内存(内存位于另一个处理器,或者是处理器之间共享的内存)快一些。原创 2024-09-10 11:50:05 · 1138 阅读 · 0 评论 -
自动 NUMA Balancing
自动 NUMA 平衡移动任务(可以是线程或进程)更接近他们访问的内存。这在自动 NUMA 平衡激活时由内核自动完成。自动 NUMA 平衡提高了在 NUMA 硬件系统上运行的应用程序的性能。在 Red Hat Enterprise Linux 7 中默认启用自动 NUMA 平衡,并在使用 NUMA 属性引导时自动激活。应用程序的手动 NUMA 调优将覆盖自动 NUMA 平衡,禁用定期不映射内存、NUMA 错误、迁移和自动 NUMA 放置。在某些情况下,首选使用系统范围的手动 NUMA 调整。原创 2024-09-10 11:48:34 · 610 阅读 · 0 评论 -
Is there a simple way to see which PCI device my NVME is?
【代码】Is there a simple way to see which PCI device my NVME is?原创 2024-09-10 10:58:31 · 509 阅读 · 0 评论 -
Intrusive MPSC node-based queue
/(*)return 0;if (next)if (tail!= head)return 0;if (next)return 0;原创 2024-09-05 17:06:47 · 367 阅读 · 0 评论 -
mpsc-queue.h
【代码】mpsc-queue.h。原创 2024-09-05 17:03:11 · 369 阅读 · 0 评论 -
linux splice pip CVE-2022-0847
本质上,这个漏洞是由内存未初始化造成的,一般此漏洞用于提权,可以修改/etc/passwd文件来达到任意写文件。受害版本内核为大于等于5.8,小于5.16.11, 5.15.25 and 5.10.102。原创 2024-09-05 15:24:12 · 1063 阅读 · 0 评论 -
mlnx-irq-tools
https://github.com/egobillot/mlnx-irq-tools原创 2024-09-05 14:43:10 · 274 阅读 · 0 评论 -
Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio
andand。原创 2024-08-21 20:17:28 · 642 阅读 · 0 评论 -
内存管理参数zone_reclaim_mode分析
在Linux系统中,有很多内存管理的配置参数,本文就详细分析参数。原创 2024-08-06 14:12:57 · 718 阅读 · 0 评论 -
Going faster than memcpy
memcpy。原创 2024-07-23 18:10:13 · 761 阅读 · 0 评论 -
Linux隔离CPU核心 isolcpus
隔核调优方式也可以直接在/etc/default/grub中修改。1.4. 修改tuned 某一种调优方式的配置文件profile。修改grub配置文件后需要更新grub配置文件,运行一下命令。通过修改isolated_cores的数字来隔离CPU。1.3. 查看系统存在调优方式的配置文件。1.2. tuned查看可用的调优方式。1.5. tuned 生效一种调优方式。1.1. 首先查看当前调优方式。1. tuned调优方式隔核。2. 修改grub配置文件。1.6. 重启生效配置。原创 2024-06-12 15:16:07 · 1418 阅读 · 0 评论 -
linux内核参数实时性能优化
本文记录了通过设置内核启动参数降低程序调度的延迟。从内核参数、测试工具等方面来阐述这个问题。在spinlock、irq上下文方面无法抢占,因此即使高优先级任务被唤醒到得以执行的时间并不能完全确定。正是因为这个执行时间的不确定性,实时系统分为硬实时和软实时,区别主要在于,软实时是统计上的实时,保证一定百分比的进程可以在规定的时间内完成。而硬实时可以保证每一个进程都可以在规定的时间内得到执行。待续。原创 2024-06-12 14:59:13 · 1346 阅读 · 0 评论 -
linux CPU隔离和进程调度优先级设置
cpuid 是从0 开始计数, cpuid可以10进制,也可以16进制0x00EA1, 1位代表一个cpu,最低位为cpu0。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。3. 补充,另外 PC(Ubuntu)机上有个taskset 命令 (默认已安装),可以设置程序运行在那个cpu上,但要隔离CPU,设置比较麻烦。4 可以使用Cgroup,配置比较复杂,可以查一下资料,这里指示做简单的介绍。原创 2024-06-12 14:40:45 · 1005 阅读 · 0 评论 -
linux内核零拷贝技术详解
Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。2. 数据拷贝基础过程在Linux系统内部缓存和内存容量都是有限的,更多的数据都是存储在磁盘中。对于Web服务器来说,经常需要从磁盘中读取数据到内存,然后再通过网卡传输给用户:上述数据流转只是大框,接下来看看几种模式。2.1 仅CPU方式当应用程序需要读取磁盘数据时,调用read()从用户态陷入内核态,read()这个系统调用最终由CPU来完成;原创 2024-06-03 10:12:52 · 1250 阅读 · 0 评论 -
linux内核splice方式实现零拷贝
如果off_in不是一个管道文件描述符(比如socket),那么off_in表示从输入数据流的何处开始读取数据,此时若为NULL,则从输入数据流的当前偏移位置读入。它可能返回0,表示没有数据需要移动,这通常发生在从管道中读数据(fd_in是管道文件描述符)而该管道没有被写入任何数据时。ESPIPE 参数fd_in(或fd_out)是管道文件描述符,而off_in(或off_out)不为NULL。fd_out/off_out参数的含义与fd_in/off_in相同,不过用于输出数据流。原创 2024-06-03 10:05:01 · 948 阅读 · 0 评论