作者:vivo 互联网服务器团队- Ye Feng
本文介绍了 Intel QAT 技术方案,通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速
当前 TLS 已经成为了互联网安全的主要传输协议,TLS带来更高的安全性的同时,也带来了更多的性能开销。特别是在建连握手阶段,TLS的CPU开销,相对于TCP要大很多。
业界在优化TLS性能上已经做了很多软件和协议层面的优化,包括:Session 复用、OCSP Stapling、TLS1.3等。然而在摩尔定律"失效"的今日,软件层面的优化很难满足日益增长的流量,使用专用的硬件技术卸载CPU计算成为目前通用的解决方案。本文将介绍Intel在TLS加速领域提供的QAT技术方案。
Intel 提供了TLS异步加速的完整解决方案: Intel QuickAssist Technology(QAT),简称Intel QAT技术。
如下图所示,QAT 支持加速的密码算法覆盖了TLS的整个流程,包括:握手阶段的签名、秘钥交换算法,数据传输的AES加解密算法等。
图1. QAT 对TLS流程的密码算法的支持(图片来源)
QAT提供了对称与非对称两类密码算法的支持,主要包括:
非对称加密算法:RSA, ECDSA, ECDHE
对称加密算法:AES-GCM(128,192,256)
注:QAT加速的优势主要体现在非对称加密上,从官方的整体性能数据看,非对称算法性能提升1.6~2倍,对称算法性能提升10%~15%
QAT Engine 是QAT技术方案的核心模块,主要的作用是作为应用程序和硬件之间的中间层,负责 “加解密操作的输入输出数据” 在用户应用程序与硬件卡之间进行传递,主要操作就是IO的读写。
QAT Engine 是以 OpenSSL 第三方插件的方式提供给用户,这个意味用户可以使用 OpenSSL 标准的API,就可以实现对TLS的加速,只需要对原有代码做OpenSSL异步改造,就可以享受QAT技术带来的TLS性能加速,业务侵入性较小。
图2. Intel QAT Engine 软件栈(图片来源)
如上图所示,QAT Engine 支持两种加速方式:
软件加速(qat_sw):使用 Multi-Buffer (SIMD)技术,对密码算法进行并行处理优化。
硬件加速(qat_hw):使用QAT硬件加速卡,将密码算法计算从CPU OffLoad到硬件加速卡。
下面将介绍软件和硬件两种加速路径的实现方式。
Intel 从 whitely 平台开始加入了新的指令集,结合intel Multi-Buffer技术,实现对密码算法的SIMD优化方案。
Intel Multi-buffer 基本原理就是使用CPU的SIMD机制,通过 AVX-512 指令集并行处理数据,来提升RSA/ECDSA算法性能。
SIMD (Single Instruction Multiple Data) 即单指令流多数据流,是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。简单来说就是一个指令能够同时处理多个数据。
Multi-Buffer 技术基于SIMD AVX-512指令集,通过队列和批量提交策略,结合OpenSSL的异步能力,每次可以最多并行处理8个密码算法操作。
Intel 的 Multi-Buffer 方案,实际上是对应Intel两个开源工程(Multi Buffer技术实现的通用密码算法底层lib库),集成在 QAT Engine 里,从而实现软件加速。
图3. Intel Engine集成了基于Multi-Buffer技术的密码算法lib
1、IP SEC lib
提供了multi-buffer 技术优化的对称加解密算法,如:AES-GCM
开源项目:http://github.com/intel/intel-ipsec-mb
2、IPP CRYPTO lib
提供了multi-buffer 技术优化的RSA/EDCSA/EDCHE算法接口,基于 Intel® Advanced Vector Extensions 512 (Intel® AVX-512) integer fused multiply-add (IFMA) 指令实现SIMD优化。
开源项目:http://github.com/intel/ippcrypto/tree/develop/sources/ippcp/crypto_mb
简而言之,QAT的软件加速的本质就是通过 AVX-512 指令集进行并行处理优化,针对并发场景性能有显著提升(下文有针对Mult-Buffer优化场景的性能测试)。
除了通过Multi-Buffer技术进行软件加速外,QAT Engine 还支持QAT硬件加速卡,通过将密码算法的计算卸载(OffLoad)到硬件加速卡,实现性能加速。
硬件加速核心是将TLS中的非对称加解密操作剥离出来,放到硬件加速卡里计算,即解放了CPU,同时专用的硬件加速卡也提供了更高的加解密性能,这是典型的硬件OffLoad技术方案。
下图为典型的 Nginx+ Intel QAT Software Stack + QAT硬件加速卡的典型应用场景:
图4. nginx+ Intel QAT Software Stack + QAT硬件加速卡的典型应用场景(图片来源)
这个典型应用场景包括四个部分:
Nginx (Async Mode): Intel 基于官方nginx(version 1.18)提供了patch,支持nginx工作在openssl的异步模式。Patch开源在:http://github.com/intel/asynch_mode_nginx
OpenSSL(支持Async Mode): OpenSSL-1.1.1 新增了async mode 特性,应用层软件可以通过标准的openssl接口,实现异步调用,提升性能。
QAT Engine: OpenSSL Engine 插件。向下和QAT API交互,将处理请求提交给硬件。详见项目开源地址:http://github.com/intel/QAT_Engine
QAT Driver:QAT加速卡的驱动程序。分为用户态和内核态两个部分。用户态的lib库提供QAT API,内核态的driver则直接和QAT硬件加速卡打交道。
Intel QAT 依赖了OpenSSL的两个特性 OpenSSL Async Mode 和 OpenSSL Engine:
OpenSSL Async Mode 能够在 async_job 执行过程中,在等待加速卡结果的时候,将 cpu 让出去;如果没有开启 async 模式,调用 openssl 函数会阻塞,cpu会阻塞等待。
OpenSSL Engine 则是提供了自定义注册加解密的方法,可以不使用 OpenSSL 自带的加解密库,指定调用第三方的加解密库。
基于两个特性,应用程序的加解密操作只需要保持使用原来相同openssl api,只需要做异步模式的兼容。另外,可以在调用OpenSSL的API时,指定到engine QAT上就行,不需要做任何额外的修改,就可以使用QAT卡进行加解密加速。
通过上面的介绍,我们可以看到QAT卡的本质是让一部分原本由CPU进行的计算转移到QAT卡上进行,因此提高QAT的利用率,降低CPU的切换开销和等待时间是性能最大化的核心工作。
OpenSSL 未启用异步ASYNC模式时,OpenSSL 调用是同步阻塞的,直到QAT_Engine返回结果。如下图的同步模式,在并发处理执行流的场景,大量CPU处于空闲等待的状态(图中虚线表示CPU处于空闲状态),无法有效地利用CPU。
图5. QAT_Engine + OpenSSL 同步模式(图片来源)
OpenSSL 开启异步ASYNC模式后,OpenSSL 调用是非阻塞的。如下图的异步模式,openssl的调用不需要等待QAT_engine的处理完成,可以有效地利用CPU,提高QAT的利用率,提升并发处理性能。
图6. QAT_Engine + OpenSSL 异步模式(图片来源)
通过OpenSSL的同步和异步模式的对比,可以看到OpenSSL-1.1.1 新增的异步Async特性,支持了异步非阻塞调用,提高了QAT的利用率,可以显著提升加解密性能。
接下来还有一个问题,CPU 如何知道 QAT 卡完成了计算呢?
Async模块为了达到并行的目的,在单线程中实现了协程(async job)。加解密操作抽象为job,多个job同时运行,使用协程进行调度。
在async job执行的过程中,当计算操作提交给QAT卡后,CPU可以把当前任务暂停,切换上下文(保存/恢复栈,寄存器等)返回给用户态。
用户态需要主动去poll这个async job的状态,是否是ASYNC_FINISHED状态。如果是,说明之前的任务已经完成,则可以继续后面的操作(取回加密/解密结果)。
注:QAT Engine 通过轮询来获取QAT卡的计算状态,基本原理是启动一个线程,不停的调用qatdriver的polling api,轮训获取qat的计算状态,得到相应结果后,写入eventfd,唤醒async job。
图7. QAT engine ASYNC运行流程(图片来源)
如上图所示,QAT Engine Async的基本流程为:
主job调用 SSL_accept,等待 TLS客户端发起 TLS handshake。
SSL内部组织了一个状态机,将握手,读写等操作抽象为两个job,ssl_io_intern(读写), ssl_do_handshake_intern(握手), 统一通过api ASYNC_start_job()进行job调度。这里启动了一个握手的job协程。
握手job执行 RSA_sign签名操作时,将sign算法卸载到硬件上计算。调用 ASYNC_pause_job() 切回主job, 并将job状态设置为ASYNC_PAUSE, 这个时候CPU会交还给主job进行其它计算工作,同时QAT并行的进行自己的计算。
主job通过SSL_waiting_for_async()接口获得的一个eventfd,并epoll这个eventfd。当QAT卡计算完成,会执行回调写入eventfd,通知主job计算已完成。
主job切换回握手job,握手job的完成剩余流程后,再调用ASYNC_pause_job()切换主job,并将job状态设置为ASYNC_FINISH,结束协程完成握手动作。
通过上面的介绍,我们了解了QAT技术方案的基本原理,下面我们看下QAT的实际加速效果。
QAT Multi-Buffer 加速方案,依赖的 OpenSSL、QAT Engine、ipp-crypto、 Intel-ipsec-mb 软件栈都是开源项目,我们可以方便的使用 openssl speed 原生加解密算法对Multi-Buffer方案进行性能评估。
硬件环境
Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
CPU(s): 8
软件环境
Linux Kernel: 4.19.91-24.1.al7.x86_64
OpenSSL 1.1.1g
gcc (GCC) 8.3.0
cmake version 3.15.5
NASM version 2.15.05
GNU Binutils 2.32
安装 QAT Engine
安装ipp-crypto、 Intel-ipsec-mb 开源lib库
测试数据
numactl -C 0 ./openssl speed rsa2048
numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 rsa2048
numactl -C 0 ./openssl speed ecdhp384
numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 ecdhp384
numactl -C 0 ./openssl speed aes-256-cbc
numactl -C 0 ./openssl speed -engine qatengine -async_jobs 8 aes-256-cbc
TLS 握手阶段的签名和秘钥交换算法
RSA 2048 sign/verify 提升 4.9/2.9倍
ECDH key exchange 提升 12倍
对称加解密算法
AES-256-CBC 性能持平
根据性能测试结果,QAT的加速优势在于TLS握手阶段的签名和秘钥交换算法,适合频繁进行TLS建连的应用场景,比如:nginx网关、长连接网关等。
本文介绍了 Intel QAT 技术方案,并讨论了方案提供的Multi-Buffer软件加速以及QAT硬件加速两种方式。同时,通过性能评估测试,我们可以看到QAT技术对TLS握手阶段的加解密算法有显著的性能提升。
最后,我们讨论一下 Intel QAT 技术的优缺点和应用场景:
主要的优点
高性能:可以显著提高计算密集型任务的性能,减少 CPU 的负载,提高系统吞吐量和响应速度。
低功耗:可以将计算密集型任务卸载到专用硬件上,降低系统功耗,提高能效比。
主要的缺点
成本较高:需要额外的硬件支持,增加了系统的成本。
应用范围受限:主要适用于计算密集型任务,对于其他类型的任务可能没有显著的性能提升。
不支持所有处理器:只支持Intel特定系列的处理器,需要特定的硬件和软件支持。
改造成本高:需要对应用程序进行QAT异步化改造,需要一定的学习成本和技术支持。
除了加解密算法之外,Intel QAT还支持压缩和解压缩、随机数生成、数字签名、视频编解码等算法。Intel QAT主要可以用于以下场景:
接入网关:比如nginx网关、长连接网关。QAT可以加速TLS协议处理,提升网关的性能
虚拟私人网络(VPN):QAT 可以加速 VPN 流量的加密和解密过程,提高吞吐量,减少延迟
存储加速:QAT 可以加速数据压缩和解压缩,减少需要传输和存储的数据量
视频编解码:QAT 可以加速视频编解码算法,提高视频处理的效率和质量
总的来说,Intel QAT 可以将计算密集型任务从 CPU 中分离出来,显著提高系统的性能和能效比,可以广泛应用于计算密集型任务的加速,包括网络安全、数据处理、云计算、存储加速、视频处理等多个领域。
参考资料:
Github:intel/QAT_Engine
Intel® QuickAssist Technology (Intel® QAT)
Intel® QuickAssist Technology & OpenSSL-1.1.0: Performance
TLS
Intel® Processor Architecture: SIMD InstructionsSIMD Instructions
[openssl] openssl async模块框架分析
对于toB的产品而言,企业首先要把工具价值做好。这里的“好”有几个层次:首先,能满足大部分客户的核心共性需求。其次,在满足需求的基础上,把体验做好。再次,在体验完善的情况下,满足一些个性化的需求。最后,才是想办法打造产品的生态。对于个性化的需求,可以开放接口或者开放一段可编辑代码给到客户。对于服务型平台来说,我觉得功能不要做得太”重“,灵活性相对更重要一些。很多企业在这里做了很多客户不需要的功能,浪费了大量资源。把软件搞得很”重“。对于服务方面,我认为改善体验也是服务的一环。体验是基础。除了产品体验外,接触用户和服务用户的过程也是可以做“体验管理”的。有几个关键点1、信息传递要专业、高效。现在基本都有客户群,但群里的工作人员,处理问题方面不够专业、高效。这就要求,公司需要给一线接触客户的员工做好培训。当然软件越复杂,培训越困难。所以要考虑建立一个问题清单库,让90%的问题,都能够很快速地找到解决方案。同时,需要让一线员工及时地更新问题清单库。2、响应客户的流程。客户出了问题,想要找到对应人解决问题。这个时间需要多久?如果光靠微信群或者人的主动性来解决实时性问题,是不靠谱的。毕竟员工没办
情景:比如说,在home目录下有两个目录:dic1和dic2(也可以这样理解这俩目录同等级)。 其中,dic1目录下有一文件text.txt,此时我们想将该文件(text.txt)复制到dic2目录下。 注意!!!!坑来了。 我最开始使用的命令如下: #先进入到dic1目录 cddic1 #将text.txt复制到dic2中 cp-rtext.txtdic2 #通过相对路径进入到dic2目录 cd../dic2 #以长列表形式显示dic2内容。 ls-l #这时你会发现dic2目录下根本就没有text.txt cd../dic1 #再回到dic1目录你会发现,其中有一个dic2目录复制解惑:①首先,cp-rtext.txtdic2这个语句是在dic1这个目录下进行操作,若是dic1目录下没有一个名为dic2的子目录,则会新创建一个dic2目录,然后将text.txt复制进刚刚新创建的dic2目录中(dic1的子目录)。 这样就和我的预期产生了截然不同的效果,这时就需要用到相对路径指向目的目录,即以下语句: cp-rtext.txt../dic2 cp命令使用时遇到的坑1.png
RFC_READ_TABLE第三方系统可通过RFC调用此函数直接访问(查询)SAPR/3系统的数据表。 合理使用此函数可以大幅度减少第三方系统集成数据接口开发量。查询表结构查询数据导入参数QUERY_TABLE表名称(必填)DELIMITER分隔符,默认值空格 在返回数据的DATA表项目中,通过此参数传递的分隔符分隔字段值,传空格则不包含分隔符NO_DATA不传输数据,默认值为空格 如果此项不为空格,则函数不返回表数据,只返回字段信息ROWSKIPS跳行数,默认值0ROWCOUNT行数,默认值0 行数为0则返回所有行表参数OPTIONS选择条件语句(传入)TEXTwhere语句文本FIELDS字段信息(传入/传出)FIELDNAME字段名OFFSET偏移量LENGTH长度TYPE数据类型FIELDTEXT字段描述 作为传入参数时,只需要传递FIELDNAME字段值,用于选择需要返回的字段; 作为传出参数时,返回字段相关信息DATA表数据(传出)WA行记录数据优化此函数可通过ROWSKIPS,ROWCOUNT参数实现分页查询,但实际使用时会发现返回的数据并没有排序,导致分页数据错乱。解决
1、SWOTSWOT分析法,即态势分析,可以用来分析我们这一年的优势、劣势、存在什么样的机会和挑战,让我们能更好的来规划新的一年。对于研发自身来说,分析对象可以是个体、部门、整个研发队伍,或者是某个产品。 总之,通过这种方式分析的结论,带有一定的决策性。2、5W1H即六何分析法,是叙事的六要素。 5W1H即六何分析法,是叙事的六要素,时间、地点、人物、起因、经过、结果。也是计划中的纵向线,啥时候,谁,干啥,为啥要干这个?怎么干?干成什么样算完成?这是一种思考方法,可以把关键事项进行准备和穷举,发现其中的风险,明确目标,最终推动方案建设。 3、KPI分析 KPI就是关键绩效指标法,按月分析数据,做成图表来查看每个月的业绩,然后根据图表来分析,什么指标好,什么指标不好,并分析其原因。KPI法符合一个重要的管理原理—“二八原理”。在一个企业的价值创造过程中,存在着“80/20”的规律,即20%的骨干人员创造企业80%的价值;而且在每一位员工身上“二八原理”同样适用,即80%的工作任务是由20%的关键行为完成的。因此,必须抓住20%的关键行为,对之进行分析和衡量,这样就能抓住业绩评价的重心。研
第4章准备工作:确定时间、空间和工具如果你已经决定全面执行这个模型,你至少需要整整两天时间,不间断地利用相关内容指导你的每个行动步骤。一旦你走上了GTD之路,为了更加高效地应用这些方法,你很可能会在某一时刻重温这些信息和建议下定决心,全力以赴!通过行动让自己感觉良好,要比通过让自己感觉良好来实现更好的行动容易得多。——O·H·莫尼尔 复制如果你拿出日程表,仔细搜寻今后两周内要处理的事情。很有可能你会发现某项提示,“噢,我要去……”。如果你立刻把这条提示信息记录在某个会促使你采取行动的系统里,你马上就会感觉轻松一些:思路更加清晰,做事更加积极。这并非什么高深的科学知识,仅仅是个有用的诀窍而已高效、创新、富有成效的思维和行动的诀窍,是在正确的时间关注适当的事情 复制我建议你多关注细节,并全面遵循下文给出的各种建议。你将发现,实施这一管理计划会对你的生活产生积极的推动作用预留时间我建议你安排整段时间来启动这一管理计划,准备一个工作区,包括适宜的空间、家具和工具。工作区安排合理,简单高效,能够大大减少处理事务时的内心抵触情绪,甚至还会吸引你坐下来投入工作,并加快你的工作节奏而理清和确定下一步行
原文地址:http://blog.csdn.net/freshlover/article/details/42640253在设计师与前端开发人员的努力下,一个WebApp出炉了,可是测试人员说了一堆的问题:某某机型下页面表现不一致,某某系统下页面如何如何,某某系统浏览器下页面怎么怎么滴。看着满满的测试汇总文档,我们曾经在一个又一个知名或不知名的手机终端上重复着这些工作:仔细的排查代码,alert可疑的变量,甚至不惜重构来尝试解决这种不一致的问题。虽然说Android4.0+以上的移动设备支持桌面版Chrome远程调试,而且在Android4.4以下也仅限于预览Chrome手机版浏览器内部效果,我们无法在问题浏览器下实时联调。此时我们往往无奈地将这些问题归为浏览器兼容性bug。我们暗暗思想着,要是手机端浏览器有个类似Firebug的调试工具就好了!现实不是!移动互联网时代,浏览器发展的趋势、浏览器调试工具发展的未来一定是基于移动端调试的便利性、远程调试的广泛支持。我们大胆预言,支持多终端跨设备跨浏览器的远程调试工具将会越来越多。Weinre(WebInspectorRemote)是一款基
JDBC全称是JavaDatabaseConnectivity,即Java数据库连接,它是一种可执行SQL语句的JavaAPI。程序可通过JDBCAPI连接到关系数据库,并使用结构化查询语言(SQL)来完成对数据库的增删改查等操作。学习JDBC需要有数据库知识。JDBC常用接口和类简介DriverManager:用于管理JDBC驱动的服务类,程序中使用该类主要功能是获取Connection对象;Connection:代表数据库连接对象,每个Connection代表一个物理连接会话,想要访问数据库,必须获得数据库连接。该方法返回Statement对象;Statement:用于执行SQL语句的工具接口,该对象既可以执行DDL语句,也可以执行DCL语句,也可以用来执行DML语句,还可以执行SQL查询,当执行SQL查询时,返回查询得到的结果集(ResultSet);PreparedStatement:预编译的Statement对象。是Statement的子接口,允许数据库预编译SQL语句,因此性能更好;ResultSet:结果集对象。该对象包含访问查询结果的方法。上方每个类/接口都含有一些方法
这几天收到师兄的任务,熟悉iGRaph包的使用,通过查资料,外加自己的实践,在此做个简单的学习笔记。 以下例子均是在R3.0.1版本下测试的。1.用igraph创建图表g<-graph(c(1,2,1,3,1,4,2,4,3,4),directed=T) >gIGRAPHD---45-- >plot(g,layout=layout.fruchterman.reingold)复制2.创建多种图形的图表>g1<-graph.full(4)>g1IGRAPHU---46--Fullgraph+attr:name(g/c),loops(g/x) >g2<-graph.ring(3)>g2IGRAPHU---33--Ringgraph+attr:name(g/c),mutual(g/x),circular(g/x) >g3=graph.lattice(c(3,4,2))#createalattice>g3IGRAPHU---2446--Latticegraph+attr:name(g/c),dimvector(g/n),nei(g
经过两天的学习,把常用的组件都学习了一遍,并做成了App学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统链接:http://pan.baidu.com/s/1hqefzEW密码:zbel 最低API2.3目标API4.4采用AndroidStudio0.58IDE希望给和我同样的初学者带来一些便利,和开发时候可以查询,第一个版本可能比较粗糙直接运行项目,每一个组件都分包了,只需要查看相应的包即可其中包括:单选框,复选框,日期控件,GridView,图片切换,消息通知栏,进度条,弹出进度条,评价条,下拉菜单,自动文本等
大家好,又见面了,我是你们的朋友全栈君。目录1、概述2、OSI七层模型和TCP/IP四层模型3、数据进入TCP/IP协议栈时的封装过程4、端口的概念5、TCP建立连接时的三次握手5.1、TCP头的构成5.2、三次握手的流程说明5.3、为什么必须使用三次握手,不能用两次握手去建立连接5.4、SYN包攻击简介6、TCP与UDP的区别及使用场景6.1、TCP与UDP的区别6.2、TCP与UDP的使用场景6.3、使用TCP和UDP的常用协议7、TCP的心跳检测机制与丢包重传机制7.1、TCP心跳检测机制7.2、TCP丢包重传机制8、常用的网络命令8.1、ping命令8.2、telnet命令8.3、ipconfig命令8.4、netstat命令8.5、route相关命令8.6、arp命令8.7、tracert命令9、在Linux和Windows两个平台中抓包9.1、在Windows系统中抓包9.2、在Linux系统中抓包10、最后1、概述当前的应用系统主要分两大类,一类是C/S(Client/Server)客户端/服务器架构的,一类是B/S(Browser/Server)浏览器/服务器架构的。无
List是一个接口,而ArrayList是一个类。 ArrayList继承并实现了List。 所以List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造。 Listlist; //正确 list=null; Listlist=newList(); // 是错误的用法 Listlist=newArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。 而ArrayListlist=newArrayList();创建一对象则保留了ArrayList的所有属性。 这是一个例子: importjava.util.*; publicclassTestList{ publicstaticvoidmain
bigint DECIMAL bigint binary(n) BINARY(n) bytea(n) bit BIT boolean,bool char(n) CHAR(n) char(n) datetime DATETIME timestamp(date,time) decimal DECIMAL decimal float FLOAT real,float4 image IMAGE bytea int INT integer,int,int4 money CURRENCY decimal nchar(n) NCHAR(n) char(n) ntext LONGTEXT text numeric DECIMAL numeric nvarchar(n) NCHARVARYING(n) varchar(n) real REAL real sma
计算机基础part01 计算机基础part02 python&pycharm基础 变量和基本数据类型 垃圾回收机制详解&用户交互&基本运算符 if流程判断 可变类型与不可变类型 深浅拷贝 while循环 for循环 基本数据类型---字符串 基本数据类型---列表&元组&字典 基本数据类型---集合 字符编码 文件操作---基础 文件操作两种模式 文件操作补充知识 函数介绍&函数返回值 函数的参数 名称空间与作用域 函数对象&函数嵌套&闭包函数 装饰器推导&无参装饰器 有参装饰器&迭代器&生成器 叠加装饰器&生成器高级&三元表达式&生成式&函数递归调用 二分法&面向过程&函数式&模块介绍 模块的使用 包 软件开发目录 常用模块-part01 常用模块-part02 常用模块-part03 项目三层架构 ATM购物车小项目 面向对象的编程---封装 面向对象特性---继承 面向对象特性---多态 多继承解决方案---mixin 绑定方法与非绑定方
valgrind包含多个工具,通过--tool=xxx指定,最被大家熟知是memcheck,主要解决内存泄露,越界访问,未初始化却去引用等问题,它是默认选项,如果未指定--tool,默认就是memcheck了。而在多线程编程中,最常见的bug有:数据竞争(datarace),死锁,错误的使用POSIX接口等问题。这些问题可以通过valgrind工具集里面的helgrind来探测。即: valgrind--tool=helgrindyourprogram 复制 利用诊断输出文件静态分析 一般探测出来的诊断信息会直接输出在终端上,但是有时候被诊断的程序可能也会输出信息到终端上,两者混淆在一起不方便阅读。这时可以通过参数--log-file=指定诊断日志文件来解决这个问题,诊断信息会输出到你指定的文件里面。 valgrind--tool=helgrind--log-file=./dump.logyourprogram 复制 甚至还可以是fd,socket。分别由参数--log-fd=,--log-socket=指定。 诊断信息通常如下: ==11525==Possibledat
1.DataFrame介绍一个Datarame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它的每一列都可以有不同的类型值(数字,字符串,布尔等等)。Datarame有行和列的索引;它可以被看作是一个Series的字典(Series们共享一个索引)。与其它你以前使用过的(如R的data.frame)类似Datarame的结构相比,在DataFrame里的面向行和面向列的操作大致是对称的。在底层,数据是作为一个或多个二维数组存储的,而不是列表,字典,或其它一维的数组集合。 DataFrame([data,index,columns,dtype,copy]) #Two-dimensionalsize-mutable,potentiallyheterogeneoustabulardatastructurewithlabeledaxes(rowsandcolumns).122DataFrame创建importpandasaspdimportnumpyasnp12使用字典创建data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada
一、使用Vue3的 路由的改变 yarnaddvue-router@next复制 main.js文件更改 路由文件更改 //src/router/index.js import{createRouter,createWebHashHistory}from'vue-router' importhomefrom'@/views/home/home' importtestfrom'@/views/test/test' //createRouter创建路由实例 constRouter=createRouter({ history:createWebHashHistory(),//hash模式:createWebHashHistory,history模式:createWebHistory routes:[ { path:'/', component:home },{ path:'/test', component:test } ] }) //抛出路由实例,在main.js中引用 exportdefaultRouter复制 运行即可 点到为止
带宽跑满的情况分析: 由于大部分托管商流入带宽不限,所以本文主要阐述服务器流出带宽跑满的情况。 流出带宽跑满主要有两种情况: 1、 正常业务流量跑满,即外部下载服务器上的资源。 2、 非正常服务流量,即可能对外攻击。 下面根据linux和windows平台阐述一下上述三种情况的检查方法: 一、Linux平台 首先可通过tcpdump抓包看查看流量详情,如果都是外部访问服务端口的流量,那可暂时排除服务器被肉鸡对外攻击。 如果是服务器有大量对外固定的IP或者端口产生大量流量,那么可能服务器被入侵对外发包了。 (1)正常流量跑满的分析处理 这时候可以通过iftop或者iptraf看一下服务器的流量走向,如果部分IP持续流量很高,很有可能这部分恶意IP在大量下载服务器的资源,可对异常IP进行限制访问。 若很多IP流量都很高,可能服务器存在较大的文件,比如在线播放的视频,热门资源文件等,可通过查看访问日志看这些IP访问的是什么文件,然后反馈进行处理,比如: 1、图片进行压缩 2、视频不设置自动播放,降低码率 3、 所有静
一、项目简介 1.项目简介 Gugua是为了解决有事务管理需要的人群的痛苦,他们需要一个便利和高效的个人和团体事务管理平台,但是现有的方案并没有很好地解决这些需求,我们有独特的办法是提供跨平台的软件和完善的事务管理安排逻辑设计,它能给用户带来随时随地使用同时具有高可用性和稳定性的体验。 2.制作团队 本产品由集美大学15软工团队“编程题全队”荣誉出品,现任成员:孙志威(201521123076)、孙慧君(201521123098)王威(201521123077)连燕波(201521123081)黄华林(201521123082),同时感谢离开的倪兢飞同学(201521123061)对于数据库设计做出的贡献。 二、宣传视频 GuguaBeta演示 三、图文展示 Gugua Gugua是一个个人事务管理(GTD)软件,同时支持轻量级的团队看板流程协作 目前的发布版本:Windows版本 功能特点介绍 1.个人GTD模块 支持勾选框,优先级,时间等 支持根据时间筛选,排序 支持子任务(Beta) 支持任务提醒(Beta) 2.个人提醒模块 Introduction 提醒事项是最
C#:STRING.FORMAT数字格式化输出 1.各种常用数字格式化 货币转换C或c(默认小数点后2位。C3后面跟的数字就代表小数后几位) string.Format("{0:C}",a)<==>a.ToString("C")//$2.50 string.Format("{0:C3}",a)<==>a.ToString("C3")//$2.500 转换为十进制数D或da=25 string.Format("{0:d}",a)<==>b.ToString("d") //转换为十进制 string.Format("{0:D5}",a)<==>a.ToString("D5")//00025 科学型计数E或ea=250000 string.Format("{0:E}",a)<==>a.ToString("