
性能优化
文章平均质量分 91
性能优化
天山老妖
多年私募基金量化IT工程师从业经验,专注于Linux/C++、Qt、Python、量化IT技术,具有丰富的中频、高频量化交易系统开发和实盘交易运维经验,熟悉CTP、盛立REM、易达YD、Xele期货柜台API,宽睿OES、华鑫Tora、中泰XTP股票柜台API。
QuantFabric开源:https://github.com/QuantFabric
展开
-
Linux性能优化(十六)——中断绑定
一、中断绑定简介1、中断简介计算机中,中断是一种电信号,由硬件产生并直接送到中断控制器上,再由中断控制器向CPU发送中断信号,CPU检测到信号后,中断当前工作转而处理中断信号。CPU会通知操作系统已经产生中断,操作系统就会对中断进行处理。常见的中断控制器有两种:可编程中断控制器8259A和高级可编程中断控制器(APIC)。8259A只适合单 CPU的情况,多CPU多核的SMP体系下,为了充分利用SMP体系结构,把中断传递给系统上的每个CPU以便更好实现并行和提高性能,Intel引入了高级可编程中断控原创 2022-02-24 09:03:46 · 7363 阅读 · 0 评论 -
Linux性能优化(十五)——CPU绑定
一、孤立CPU1、孤立CPU简介针对CPU密集型的任务,CPU负载较高,推荐设置CPU Affinity,以提高任务执行效率,避免CPU进行上下文切换,提高CPU Cache命中率。默认情况下,Linux内核调度器可以使用任意CPU核心,如果特定任务(进程/线程)需要独占一个CPU核心并且不想让其它任务(进程/线程)使用时,可以把指定CPU孤立出来,不让其它进程使用。2、孤立CPU的特点孤立CPU可以有效地提高孤立CPU上任务运行的实时性,在保证孤立CPU上任务运行的同时会减少了其它任务原创 2022-02-24 09:03:16 · 4936 阅读 · 0 评论 -
Linux性能优化(十四)——CPU Cache
一、CPU Cache1、CPU Cache简介CPUCache是位于CPU与内存之间的临时存储器,容量比内存小但交换速度却比内存要快得多。Cache的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,会使CPU花费很长时间等待数据到来或把数据写入内存。在Cache中的数据是内存中的一小部分,但是CPU短时间内即将访问的,当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。Cache对CPU的性能影响很大,主要是因为CP.原创 2022-02-24 09:02:58 · 3744 阅读 · 0 评论 -
Linux性能优化(十三)——CPU性能测试
一、CPU上下文切换测试场景使用sysbench模拟多线程调度:sysbench --threads=10 --time=300 threads run使用vmstat查看CPU上下文切换:cs列上下文切换次数超过150万次。r列就绪队列长度最大达到8,超过系统CPU的个数4,存在大量的CPU竞争。sy列超过70%,说明CPU主要是被内核占用。in列中断次数上升到40000以上,说明中断处理也是个潜在的问题。系统就绪队列过长,即正在运行和等待CPU的进程数过多,导.原创 2022-02-24 09:02:39 · 5673 阅读 · 0 评论 -
Linux性能优化(十二)——CPU性能调优
一、应用程序优化(1)编译器优化。适当开启编译器优化选项,在编译阶段提升性能。gcc提供优化选项-On会自动对应用程序的代码进行优化。(2)算法优化。使用复杂度更低的算法,可以显著加快处理速度。在数据比较大的情况下,可以用O(nlogn)的排序算法(如快排、归并排序等),代替O(n^2)的排序算法(如冒泡、插入排序等)。(3)异步处理。使用异步处理,可以避免程序因为等待某个资源而一直阻塞,从而提升程序的并发处理能力。把轮询替换为事件通知,就可以避免轮询耗费CPU的问题。(4)多线程代替多进程原创 2022-02-24 09:02:23 · 2044 阅读 · 0 评论 -
Linux性能优化(十一)——CPU性能优化原理
一、CPU上下文切换1、CPU上下文Linux是多任务操作系统,支持远大于CPU数量的任务同时运行。在每个任务运行前,CPU需要知道任务从哪里加载、从哪里开始运行,即需要系统事先为CPU设置好CPU寄存器和程序计数器(Program Counter,PC)。CPU寄存器是CPU内置的容量小、但速度极快的内存,程序计数器是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。CPU寄存器和程序计数器是CPU运行任何任务前必须的依赖环境,即CPU上下文。CPU上下文会存储在系统内.原创 2022-02-24 09:02:10 · 1634 阅读 · 0 评论 -
Linux性能优化(十)——CPU性能分析工具
一、CPU性能指标1、CPU使用率CPU使用率是最常见的一个性能指标,描述了非空闲时间占总CPU 时间的百分比,根据CPU上运行任务的不同,分为用户CPU、系统CPU、等待IO CPU、软中断和硬中断等。用户CPU使用率包括用户态CPU使用率(user)和低优先级用户态CPU使用率(nice),表示CPU在用户态运行的时间百分比。用户CPU使用率高,通常说明有应用程序比较繁忙。系统CPU使用率,表示CPU在内核态运行的时间百分比(不包括中断)。系统CPU使用率高,说明内核比较繁忙。等待I原创 2022-02-23 12:47:48 · 1763 阅读 · 0 评论 -
Linux性能优化(九)——Kernel Bypass
一、Linux内核协议栈性能瓶颈在x86体系结构中,接收数据包的传统方式是CPU中断方式,即网卡驱动接收到数据包后通过中断通知CPU处理,然后由CPU拷贝数据并交给内核协议栈。在数据量大时,CPU中断方式会产生大量 CPU中断,导致CPU负载较高。(1)硬件中断导致的线程、进程切换硬件中断请求会抢占优先级较低的软件中断,频繁到达的硬件中断和软中断意味着频繁的线程切换,随着而来的就是运行模式切换、上下文切换、线程调度器负载、高速缓存缺失(Cache Missing)、多核缓存共享数据同步.原创 2022-02-23 12:47:28 · 6615 阅读 · 1 评论 -
Linux性能优化(八)——网络测试工具
一、ping1、ping简介PING是一个网络工具,用来测试与网络主机俄连通性。PING通过发送ICMP ECHO_REQUEST数据包到网络主机,并显示响应情况,程序会按时间和成功响应的次数估算丢失数据包率。ping命令每秒发送一个ICMP数据包并且为每个接收到的响应打印一行输出。ping命令计算信号往返时间和(信息)包丢失情况的统计信息,并且在完成后显示一个简要总结。ping命令在程序超时或当接收到SIGINT信号时结束。PING发送的每个ICMP请求包含一个网际协议(IP)和IC...原创 2022-02-23 12:47:02 · 3809 阅读 · 0 评论 -
Linux性能优化(七)——网络流量监控工具
一、iftop1、iftop简介iftop命令可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等。在线安装:yum install iftop2、iftop命令iftop -h | [-nNpblP] [-u unit] [-i interface] [-f filter code] [-F net/mask] [-G net6/mask6]-h:查看帮助信息-i:指定监控网卡-b:不显示流量柱状图-B:以字节为单位显示流量(默认bits)原创 2022-02-23 12:46:45 · 2098 阅读 · 0 评论 -
Linux性能优化(六)——网络配置工具
一、ifconfig1、ifconfig简介ifconfig可以简单地获取网络接口配置信息,还可以修改配置。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。2、ifconfig命令ifconfig [-v] [-a] [-s] [interface]ifconfig [-v] interface [aftype] options | addressup:启动指定网络设备/网卡。down:关闭指定网络设备/网卡。该参数可以有效地阻止通过指定接口的IP信原创 2022-02-23 12:46:21 · 2624 阅读 · 0 评论 -
Linux性能优化(五)——性能监控工具
一、性能分析工具简介Brendan Gregg是算机性能设计、分析和调优专家,编写开源大量性能测试工具。http://www.brendangregg.com1、性能分析工具2、性能观测工具3、性能测评工具4、性能调优工具二、常用工具1、free free指令会显示内存的使用情况,包括实体内存、虚拟的交换文件内存、共享内存区段以及系统核心使用的缓冲区等。free [-bkmotV][-s <间隔秒数>]-b ...原创 2022-02-23 12:45:19 · 6496 阅读 · 0 评论 -
Linux性能优化(四)——BCC性能监控工具
一、BCC简介1、BCC简介BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。BCC工具集大部分工具需要Linux Kernel 4.1以上版本支持,完整工具支持需要Linux Kernel 4.15以上版本支持。GitHub:https://github.com/iovisor/bc原创 2022-02-23 12:44:24 · 3934 阅读 · 1 评论 -
Linux性能优化(三)——sysstat性能监控工具
一、sysstat简介1、sysstat简介sysstat提供了Linux性能监控工具集,包括sar、sadf、mpstat、iostat、pidstat等,用于监控Linux系统性能和使用情况。iostat - 提供CPU统计,存储I/O统计(磁盘设备,分区及网络文件系统)mpstat - 提供单个或组合CPU相关统计pidstat - 提供Linux进程级别统计:I/O、CPU、内存等sar - 收集、报告、保存系统活动信息:CPU、内存、磁盘、中断、网络接口、TTY、内核表等原创 2022-02-23 12:43:56 · 6470 阅读 · 0 评论 -
Linux性能优化(二)——sysbench压力测试工具
一、sysbench简介1、sysbench简介sysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。sysbench提供如下测试:(1)CPU性能(2)磁盘IO性能(3)调度程序性能(4)内存分配及传输速度(5)POSIX线程性能(6)数据库性能(OLTP基准测试)sysbench支持MySQL、PostgreSQL、Oracle数据库。2、sysbench安装Build构建依赖安装:yum...原创 2022-02-23 12:43:35 · 5981 阅读 · 0 评论 -
Linux性能优化(一)——stress压力测试工具
一、stress简介1、stress简介stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。2、stress安装安装:sudo yum install stress二、stress使用1、stress命令stress [OPTION [ARG]]-c, --cpu N:产生N个进程,每个进程都循环调用sqrt函数产生CPU压力。-i, --io N:产生N个进程,每个进程循环调用sync将内存缓冲区内容写到磁盘上,产生IO原创 2022-02-23 12:43:19 · 33416 阅读 · 0 评论 -
C++性能优化(十三)——无锁队列
一、无锁队列原理1、队列操作模型队列是一种非常重要的数据结构,其特性是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信间经常采用队列做缓存,缓解数据处理压力。根据操作队列的场景分为:单生产者——单消费者、多生产者——单消费者、单生产者——多消费者、多生产者——多消费者四大模型。根据队列中数据分为:队列中的数据是定长的、队列中的数据是变长的。(1)单生产者——单消费者(2)多生产者——单消费者(3)单生产者——多消费者(4)多生产者——多消...原创 2022-02-21 10:54:03 · 11005 阅读 · 7 评论 -
C++性能优化(十二)——自旋锁
一、互斥锁1、互斥锁简介互斥锁属于sleep-waiting类型锁。Linux Kernel 2.6.x稳定版开始,Linux的互斥锁都是futex (FastUsermodeMutex)锁。Futex是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。Futex由Hubertus Franke(IBM Thomas J. Watson 研究中心),Matthew Kirkwood,Ingo Molnar(Red Hat)和 Rusty Russell(IBM ..原创 2022-02-21 10:38:19 · 7063 阅读 · 2 评论 -
C++性能优化(十一) —— 内存管理器性能分析
一、PTMalloc21、PTMalloc2优点(1)集成在glibc中,Linux主要发行版的通用实现。2、PTMalloc2缺点(1)后分配的内存先释放。由于ptmalloc2收缩内存是从top chunk开始,如果与top chunk相邻的chunk不能释放,top chunk 以下的chunk都无法释放。(2)多线程锁开销大,需要避免多线程频繁分配释放。(3)内存从thread的arena中分配,不能从一个arena移动到另一个arena。如果多线程使用内存不均衡,容易导致内原创 2022-02-21 10:29:19 · 1146 阅读 · 0 评论 -
C++性能优化(十) —— JeMalloc
一、JeMalloc简介1、JeMalloc简介JeMalloc是一款内存分配器,最大的优点在于多线程情况下的高性能以及内存碎片的减少。GitHub地址:GitHub - jemalloc/jemalloc2、JeMalloc安装JeMalloc源码下载:git clone https://github.com/jemalloc/jemalloc.git构建工具生成:autogen.sh编译选项配置:configure编译:make -j4安装:原创 2022-02-21 10:28:35 · 6740 阅读 · 3 评论 -
C++性能优化(九) —— TCMalloc
一、TCMalloc简介1、TCMalloc简介TCMalloc(Thread-Caching Malloc,线程缓存的malloc)是Google开发的内存分配算法库,最初作为Google性能工具库perftools的一部分,提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数(malloc、free,new,new[]等),具有减少内存碎片、适用于多核、更好的并行性支持等特性。TCMalloc属于gperftools,gperftools项目包括heap-checker、h..原创 2022-02-21 10:26:38 · 5478 阅读 · 0 评论 -
C++性能优化(八)——内存分配机制
一、操作系统内存布局1、32位系统经典内存布局LinuxKernel 2.6.7前版本采用的默认内存布局形式如下:(1)32操作系统中,loader将可执行文件的各个段次依次载入到从0x80048000(128M)位置开始的空间中。应用程序能够访问的最后地址是0xbfffffff(3G)的位置,3G以上的位置是给内核使用的,应用程序不能直接访问。(2)内存布局从低地址到高地址依次为:txet段、data段、bss段、heap、mmap映射区、stack栈区。(3)heap和mm.原创 2022-02-21 10:21:10 · 2381 阅读 · 0 评论 -
C++性能优化(七)——内存池技术
一、内存池简介1、C++内存池简介内存池(Memory Pool)是一种内存分配方式,是在真正使用内存前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。通用内存分配和释放的缺点如下:(1)使用malloc/new申请分配堆内存时系统需要根据最先匹配、最优匹配或其它算法在内存空闲块表中查找一块空闲内存;使用free/delete释放堆内存时,系统可能需要合并空闲内存块,因此会产生额外开销。(2原创 2022-02-21 10:19:40 · 7054 阅读 · 0 评论 -
C++性能优化(六)——动态内存管理
一、new/delete操作符C++实现通过全局new/new []和delete/delete []来提高动态内存的访问和管理。operator new可以是类的成员函数或全局函数,通常C++运行库提供了默认的全局new/new []和delete/delete []实现,应用程序也可以用自定义实现代替C++运行库提供的默认实现,但一个程序最多只能有一个自定义实现。C++标准中new/new []和delete/delete []声明定义如下:namespacestd{class..原创 2022-02-21 10:10:15 · 1515 阅读 · 0 评论 -
C++性能优化(五)——操作系统的内存管理
一、操作系统内存管理简介长期以来,在计算机系统中,内存都是一种紧缺和宝贵的资源,应用程序必须在载入内存后才能执行。早期,在内存空间不够大时,同时运行的应用程序的数量会受到很大的限制,甚至当某个应用程序在某个运行时所需内存超过物理内存时,应用程序就会无法运行。现代操作系统(Windows、Linux)通过引入虚拟内存进行内存管理,解决了应用程序在内存不足时不能运行的问题。本质上,虚拟内存就是要让一个程序的代码和数据在没有全部载入内存时即可运行。运行过程中,当执行到尚未载入内存的代码,或者要访问还没有载原创 2022-02-21 09:57:42 · 1009 阅读 · 0 评论 -
C++性能优化(四)——C++常用数据结构性能分析
本文将根据各种实用操作(遍历、插入、删除、排序、查找)并结合实例对常用数据结构进行性能分析。一、常用数据结构简介1、数组数组是最常用的一种线性表,对于静态的或者预先能确定大小的数据集合,采用数组进行存储是最佳选择。数组的优点一是查找方便,利用下标即可立即定位到所需的数据节点;二是添加或删除元素时不会产生内存碎片;三是不需要考虑数据节点指针的存储。然而,数组作为一种静态数据结构,存在内存使用率低、可扩展性差的缺点。无论数组中实际有多少元素,编译器总会按照预先设定好的内存容量进行分配。如果超..原创 2022-02-21 09:56:49 · 1213 阅读 · 2 评论 -
C++性能优化(三)——C++语言特性性能分析
一、C++语言特性性能分析简介通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序。因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性。新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降。但事实并非如此,通常一个程序的速度在框架设计完成时大致已经确定,而并非因为采原创 2022-02-21 09:47:13 · 2195 阅读 · 0 评论 -
C++性能优化(二)——C++对象模型
一、C++对象模型与性能优化对象模型是面向对象程序设计语言的重要方面,会直接影响面向对象语言编写程序的运行机制以及对内存的使用机制,因此了解对象模型是进行程序性能优化的基础。只有深入理解C++对象模型,才能避免程序开发过程中一些不易发现的内存错误,从而改善程序性能,提高程序质量。二、C++程序的内存分布1、程序内存分布简介通常,计算机程序由代码和数据组成,因此代码和数据也是影响程序所需内存的主要因素。代码是程序运行的指令,比如数学运算、比较、跳转以及函数调用,其大小通常由程序的功能和复杂度决原创 2022-02-21 09:33:25 · 1158 阅读 · 0 评论 -
C++性能优化(一)——应用程序性能优化简介
一、程序性能优化简介1、程序性能优化简介在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制。因此,早期的程序对运行性能和内存空间占用的要求是非常严格的,很多开发人员为了减少1%的CPU运行时间,为减少几十个甚至几个字节而不懈努力。随着计算机技术的快速发展,硬件资源变得相对便宜。但如果认为软件开发时,程序的性能优化不再重要,硬件将解决性能问题也是片面的。计算机硬件的发展解决了部分软件的性能问题,但随着硬件计算能力的提高,用户对软件功能的要求也越来原创 2022-02-21 09:15:49 · 2946 阅读 · 0 评论