高并发质量调试经验分享澳门美高梅手机网站

品类背景

小编们针对 nginx 事件框架和 openssl 协议栈进行了一些纵深改造,以升级 nginx
的 HTTPS 完全握手总括质量。

出于原生 nginx 使用当地 CPU 做 本田UR-VSA 总结,ECDHE_大切诺基SA
算法的单核处理能力唯有 400 qps 左右。前期测试时的并发质量十分的低,就算开了
24 核,质量也无力回天超越 1 万。

着力作用在二零一八年初就完事了付出,线下测试也未尝意识难题。经过优化后的性质升高几倍,为了测试最大质量,使用了众多客户端并发测试
https 质量。相当的慢就碰见了有的题材:

 

1.先是个难点是 nginx 有非常低概率(亿分之一)在分裂地点 core
dump。白天线下压力测试 2W qps 一般都要两三个钟头才出1回core。每一遍清晨睡觉以前都会将最新的调节和测试代码编写翻译好并运营测试,到中午睡醒第二眼就会去查看机器并祈祷不要出
core,不幸的是,一般都会有多少个到几十个core,并且会意识平常是在三个年华点集中 core dump。线上灰度测试运营了 6
天,在第 6 天的上午才集中 core dump 了几拾1遍。那样算来,那几个 core dump
的票房价值至少是亿分之一了。 然则和面试标题中二十多线程区别的是,nginx
接纳的是多进程 +
全异步事件驱动的编制程序情势(最近也扶助了三十二线程,但只是指向 IO
的优化,宗旨机制仍然多过程加异步)。在 webserver
的兑现背景下,多进度异步比较三十二线程的长处是性质高,没有太八线程间的切换,而且内部存储器空间独立,省去线程间锁的竞争。当然也有缺点,正是异步格局编制程序格外复杂,将有些逻辑上连接的轩然大波从半空和时间切割,不适合人的常规思考习惯,出了难点后相比难追查。别的异步事件对网络和操作系统的底层知识供给较高,稍十分大心就简单挖坑。

2.次之个难题是高并发时 nginx
存在内部存款和储蓄器泄漏。在流量低的时候没有失水准,加大测试流量就会冒出内部存款和储蓄器泄漏。

3.第多少个难点,因为我们对 nginx 和 openssl
的要害代码都做了部分改造,希望升高它的习性。那么什么样找到品质热点和瓶颈并不断优化呢?

个中第②和第二个难点的背景都以,唯有出现上万 qps
以上时才有恐怕出现,几百可能一三千 QPS 时,程序尚未任何难点。

单机格局

下载zookeeper的安装包之后, 解压到合适目录.
进入zookeeper目录下的conf子目录, 创制zoo.cfg:

tickTime=2000    
dataDir=/Users/apple/zookeeper/data    
dataLogDir=/Users/apple/zookeeper/logs    
clientPort=4180   

参数表明:

  • tick提姆e: zookeeper中央银行使的主干时间单位, 阿秒值.
  • dataDir: 数据目录. 可以是私行目录.
  • dataLogDir: log目录, 同样可以是随机目录. 就算没有设置该参数,
    将动用和dataDir相同的设置.
  • clientPort: 监听client连接的端口号.

至此, zookeeper的单机形式已经布置好了. 运行server只需运营脚本:

bin/zkServer.sh start  

 Server运行之后, 就能够运营client连接server了, 执行脚本:

bin/zkCli.sh -server localhost:4180   

引文

6月份的时候看到一道面课题,据他们说是腾讯校招面试官提的:在多线程和高产出环境下,若是有一个平分运营一百万次才出现2遍的
bug,你怎么调节那么些bug?网易原贴地址如下:腾讯实习生面试,那两道标题该怎么回应? – 编制程序

不满的是果壳网很多答案在攻击那道题自身的科学,就算自己不是本次的面试官,但自己觉得那是一道尤其好的面试题。当然,只是道加分题,答不上,不扣分。答得没错,表明化解难题的思绪和力量要超过应届一生均水平。

因而写上面那段,是因为自己以为超过3/6后台服务端开发都有可能遇见那样的
BUG,固然没有境遇,那样的题材也能够激发大家不断揣摩和总计。卓殊凑巧的是,小编在
4 月份也遇到了贰个看似的同时要进一步严重的
BUG,那是作者自个儿挖的叁个很深的坑,不填好,整个项目就不可能上线。未来曾经过去了一个多月,趁着有时光,自个儿特出总括一下,希望里面涉及的局地经验和工具能够带给我们一点扶持。

集群方式

集群情势的陈设和伪集群基本一致.
由于集群情势下, 各server布署在分歧的机械上,
因而各server的conf/zoo.cfg文件能够完全一样.
下边是七个示范:

tickTime=2000    
initLimit=5    
syncLimit=2    
dataDir=/home/zookeeper/data    
dataLogDir=/home/zookeeper/logs    
clientPort=4180  
server.43=10.1.39.43:2888:3888  
server.47=10.1.39.47:2888:3888    
server.48=10.1.39.48:2888:3888  

示范中安排了3台zookeeper server, 分别配备在10.1.39.43, 10.1.39.47,
10.1.39.48上. 须求注意的是,
各server的dataDir目录下的myid文件中的数字必须分歧.

10.1.39.43 server的myid为43, 10.1.39.47 server的myid为47, 10.1.39.48
server的myid为48.

质量热点分析

到此,经过改造的 nginx 程序没有 core dump
和内部存款和储蓄器泄漏方面包车型大巴风险了。但那鲜明不是大家最关心的结果(因为代码本该如此),大家最关怀的题材是:

  • 代码优化前,程序的瓶颈在哪儿?能够优化到哪边水平?

  • 代码优化后,优化是或不是干净?会冒出什么新的属性热点和瓶颈?

       那么些时候大家就须求有些工具来检测程序的习性热点。

perf,oprofile,gprof,systemtap

linux 世界有无数卓殊好用的性质分析工具,小编选拔六款最常用的简要介绍下:

  •  [perf](Perf Wiki) 应该是最完美最利于的1个属性检测工具。由 linux
    内核引导并且一路创新,基本能满意平常使用。** 推荐大家使用 **。

  • oprofile,小编觉着是2个较老式的质量检查和测试工具了,基本被 perf
    取代,命令使用起来也不太有利。比如 opcontrol –no-vmlinux , opcontrol
    –init 等一声令下运转,然后是 opcontrol –start, opcontrol –dump,
    opcontrol -h 截至,opreport
    查看结果等,一大串命令和参数。有时候使用还易于忘记开首化,数据就是空的。

  •  gprof重假如针对应用层程序的习性分析工具,缺点是索要重新编写翻译程序,而且对程序质量有一部分影响。不补助基础层面包车型地铁有个别总括,优点正是应用层的函数质量总结相比较精细,接近我们对常见质量的知晓,比如各样函数时间的运维时刻,,函数的调用次数等,很人性易读。

  • systemtap
    其实是3个周转时先后依旧系统音讯搜集框架,重要用以动态追踪,当然也能用做品质分析,作用最强劲,同时利用也针锋相对复杂。不是1个总结的工具,能够说是一门动态追踪语言。如若程序出现极度麻烦的属性难题时,推荐应用
    systemtap。

此间再多介绍一下 perf 命令,tlinux 系统上私下认可都有安装,比如通过 perf top
就能列举出当下系统或然经过的热门事件,函数的排序。

      perf record
能够纪录和保留类别或许经过的性质事件,用于末端的辨析,比如接下去要介绍的火苗图。

火焰图 flame graph

perf
有一个欠缺便是不直观。火焰图正是为着消除那几个标题。它亦能够矢量图形化的措施展示事件热点及函数调用关系。比如自身透过如下几条命令就能绘制出原生
nginx 在 ecdhe_rsa cipher suite 下的脾性热点:

1.perf record -F 99 -p PID -g — sleep 10

2.erf script | ./stackcollapse-perf.pl > out.perf-folded

3../flamegraph.pl out.perf-folded>ou.svg

澳门美高梅手机网站 1

 

直白通过火焰图就能来看种种函数占用的比重,比如上海体育场地就能精晓地领略
rsaz_1024_mul_avx2 和 rsaz_1024_sqr_avx2 函数占用了 3/4的采样比例。那我们要优化的对象也就极度驾驭了,能或不能够制止那四个函数的计量?只怕接纳非本地
CPU 方案完毕它们的乘除?

本来是能够的,我们的异步代理总计方案就是为了消除这一个标题,

澳门美高梅手机网站 2

心态

为了化解地方提到的 core dump
和内部存款和储蓄器泄漏难题,花了大概三周左右小时。压力十分大,精神中度紧张,
说实话有些窘迫,看似几个很简短的标题,搞了这么长日子。心里自然不是很爽,会稍稍心急,尤其是项目标关键上线期。但正是如此,整个进程本人照旧要命自信并且龙精虎猛。作者一直在报告自个儿:

1.调节 BUG
是二遍非凡难能可贵的学习机会,不要把它作为是负责。不管是线上依旧线下,能够主动地,高效地追查
BUG 尤其是有难度的
BUG,对友好来说1回格外难得的就学机会。面对如此好的求学机会,自然要充满热情,要如饥似渴,回首一看,假设不是因为这一个BUG,小编也不会对某个工具有更浓密地询问和行使,也就不会有那篇文书档案的发生。

2.不管什么的
BUG,随着时间的推迟,肯定是力所能及消除的。那样考虑,其实会轻松很多,尤其是接替新品类,改造复杂工程时,由于对代码,对事情一初步并不是很熟知,需求3个过渡期。但根本是,你要把这么些标题放在心上。白天上班有无数业务干扰,上下班途中,深夜睡觉前,大脑反而会越来越清醒,思路也会越来越清晰。越发是公共场面上班时便于思维定势,陷入3个长日子的误区,在那里调节和测试了半天,结果大脑一片混沌。睡觉前只怕上下班路上壹人时,反而能想出某些新的思路和措施。

3.盛开地谈论。遭受难点不用倒霉意思,不管多简单,多低级,只要那些标题不是您
google 一下就能取得的下结论,大胆地,认真地和组内同事谈论。此次 BUG
调节和测试,有两回首要的商讨给了本人极大的启迪,尤其是终极 reusable
的难题,也是组内同事的座谈才激起了自身的灵感。感激我们的协助。

 

当然来源于:http://mp.weixin.qq.com/s?\_\_biz=MzI5NjAxODQyMg==&mid=2676478541&idx=1&sn=60537ca932bc3577cc9a1118eaecdc4e&scene=0\#rd

伪集群方式

所谓伪集群, 是指在单台机器中运行多个zookeeper进度, 并组成一个集群.
以运维一个zookeeper进程为例.

将zookeeper的目录拷贝2份:

|--zookeeper0  
|--zookeeper1  
|--zookeeper2  

 更改zookeeper0/conf/zoo.cfg文件为:

tickTime=2000    
initLimit=5    
syncLimit=2    
dataDir=/Users/apple/zookeeper0/data    
dataLogDir=/Users/apple/zookeeper0/logs    
clientPort=4180  
server.0=127.0.0.1:8880:7770    
server.1=127.0.0.1:8881:7771    
server.2=127.0.0.1:8882:7772  

新增了多少个参数, 其含义如下:

  • initLimit: zookeeper集群中的包蕴多台server, 个中一台为leader,
    集群中别的的server为follower. initLimit参数配置初叶化连接时,
    follower和leader之间的最长心跳时间. 此时该参数设置为5,
    表达时限为5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 该参数配置leader和follower之间发送音信,
    请求和应对的最大日子长度. 此时该参数设置为2,
    表达时间限定为2倍tickTime, 即陆仟ms.
  • server.X=A:B:C 当中X是多个数字, 表示那是第几号server.
    A是该server所在的IP地址.
    B配置该server和集群中的leader交流消息所利用的端口.
    C配置公投leader时所采纳的端口. 由于配备的是伪集群方式,
    所以各种server的B, C参数必须分裂.

参考zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg,
和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir,
clientPort参数即可.

在后面设置的dataDir中新建myid文件, 写入1个数字,
该数字代表那是第几号server.
该数字必须和zoo.cfg文件中的server.X中的X一一对应.
/Users/apple/zookeeper0/data/myid文件中写入0,
/Users/apple/zookeeper1/data/myid文件中写入1,
/Users/apple/zookeeper2/data/myid文件中写入2.

个别进入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin,
/Users/apple/zookeeper2/bin多个目录, 运营server.
自由选用三个server目录, 运转客户端:

bin/zkCli.sh -server localhost:4180  

分布式自动测试系统的塑造

由于是 HTTPS 请求,使用 ECDHE_安德拉SA
密钥交流算法时,客户端的揣摸消耗也比较大,单机也就 10000 多
qps。也便是说要是 server 的属性有 3W
qps,那么一台湾旅客户端是无力回天发送这么大的下压力的,所以须求营造2个多机的分布式测试系统,即透过中央控制机同时决定多台测试机客户端启动和平息测试。

事先也关系了,调节和测试效用太低,整个测试进度须要能够自动化运营,比如早上睡觉前,能够控制多台机械在不一致的协议,不相同的端口,不相同的
cipher suite
运行总体夜晚。白天因为一直在盯着,运转几分钟就需求查阅结果。 那一个连串有如下效果:

  • 并发控制多台测试客户端的启停,最终汇总输出总的测试结果。

  • 扶助 https,http 协议测试,补助 webserver 及 revers proxy 品质测试。

  • 支撑配置差别的测试时间、端口、U昂CoraL。

  • 依据端口采用差别的 SSL 协议版本,区别的 cipher suite。

  • 根据 URL 选择 webserver、revers proxy 模式。

Zookeeper的装置和配备相当总结, 既可以陈设成单机情势,
也足以安顿成集群情势. 下边将各自举行介绍.

AddressSanitizer 的优点

address sanitizer(简称 asan)是3个用来检查和测试 c/c++
程序的全速内部存款和储蓄器检查和测试工具。相比较 valgrind
的帮助和益处就是速度快,官方文书档案介绍对先后品质的狂跌唯有 2 倍。对 Asan
原理有趣味的同室可以参见 asan
的算法那篇作品,它的落到实处原理便是在程序代码中插入一些自定义代码,如下:

澳门美高梅手机网站 3

和 valgrind 显然例外的是,asan
必要丰裕编写翻译开关心器重新编写翻译程序,万幸不要求团结修改代码。而 valgrind
不需求编制程序顺序就能一向运转。

  address sanitizer 集成在了 clang 编写翻译器中,GCC 4.8
版本以上才支撑。大家线上先后暗许都以采用 gcc4.3
编写翻译,于是作者测试时直接使用 clang 重新编写翻译 nginx:

澳门美高梅手机网站 4

由于 AddressSanitizer 对 nginx
的熏陶较小,所以大压力测试时也能落得上万的面世,内部存款和储蓄器泄漏的难点很简单就定位了。这里就不详细介绍内部存款和储蓄器泄漏的缘故了,因为跟
openssl
的错误处理逻辑有关,是自笔者自个儿完毕的,没有大面积的参阅意义。最关键的是,知道
valgrind 和 asan 的选取情形和办法,境遇内部存款和储蓄器方面包车型大巴难题能够火速修复。

弱互联网环境的结构 traffic control

联想到夜间有不足为奇的互连网硬件调整及故障,作者估摸那个 core dump
大概跟网络品质相关。尤其是网络须臾时不平静,很不难触发 BUG 导致大气的 CORE
DUMP。最开始自作者设想过使用 TC(traffic control)
工具来布局弱网络环境,不过转念一想,弱互连网环境导致的结果是怎么着?鲜明是网络请求的各个卓殊啊,
所以还不如直接组织各个格外请求来复现难点。于是准备构造测试工具和条件,必要满意多个规格:

 

1.并发品质强,能够同时发送数万竟然数八万级以上 qps。

2.请求须求自然可能率的相当。特别是 TCP 握手及 SSL 握手阶段,要求非凡中止。

traffic control 是四个很好的结构弱网络环境的工具,笔者从前用过测试
SPDY 协议质量。能够决定互连网速率、丢包率、延时等网络环境,作为 iproute
工具集中的1个工具,由 linux 系统自带。但相比较勤奋的是 TC
的布局规则很复杂,facebook 在 tc 的基础上包裹成了1个开源工具
apc,有趣味的能够尝试。

bug 怎么着复出?

那时的调剂功效已经十分低了,几万 QPS 接二连三压力测试,多少个小时才出一次CORE,然后修改代码,添加调节和测试日志。几天过去了,毫无进展。所以必供给在线下结构出安宁的
core dump 环境,那样才能加速 debug
效能。就算还不曾发现根本原因,可是发现了3个很质疑的地点:出 CORE
比较集中,平常是在凌晨 4,5 点,深夜 7,8 点的时候 dump 几十一个 CORE。

 

WQX56K 压力测试工具

是因为高并发流量时才大概出
core,所以首先就必要找壹天性情强劲的压测工具。WSportageK是一款非凡完美的开源
HTTP 压力测试工具,采取多线程 + 异步事件驱动的框架,在那之中事件机制使用了
redis 的 ae 事件框架,协议分析接纳了 nginx 的连带代码。相比较 ab(apache
bench)等古板压力测试工具的助益便是性质好,基本上单台机器发送几百万 pqs,
打满网卡都没有失水准。wrk 的败笔便是只帮忙 HTTP
类协议,不支持任何协商类测试,比如 protobuf,其它数码显示也不是很有利。

nginx 的测试用法: wrk -t500 -c3000 -d30s
https://127.0.0.1:8443/index.html

valgrind 的缺点

并发内部存款和储蓄器泄漏或许内部存款和储蓄器难点,大家第③时半刻间都会想到 valgrind。valgrind
是一款越发优良的软件,不必要再一次编写翻译程序就可见一贯测试。功效也丰裕强劲,能够检查和测试常见的内部存款和储蓄器错误包括内部存款和储蓄器初阶化、越界访问、内部存款和储蓄器溢出、free
错误等都能够检查和测试出来。推荐我们使用。

valgrind 运营的基本原理是:待测程序运营在 valgrind 提供的照猫画虎 CPU
上,valgrind 会纪录内部存款和储蓄器访问及统计值,最后实行比较和错误输出。笔者经过
valgrind 测试 nginx 也发现了部分内部存款和储蓄器方面包车型地铁不当,简单分享下 valgrind 测试
nginx 的经历:

  • nginx 平日都是使用 master fork
    子进程的点子运转,使用–trace-children=yes 来追踪子进程的消息

  • 测试 nginx + openssl 时,在行使 rand
    函数的地方会唤起广大内部存款和储蓄器不当。比如 Conditional jump or move depends
    on uninitialised value,Uninitialised value was created by a heap
    allocation 等。那是出于 rand
    数据需求一些熵,未起始化是常规的。就算须要去掉 valgrind
    提醒错误,编译时索要加2个精选:-DPU奥迪Q5IFY

  • 倘使 nginx 进度较多,比如跨越 4 个时,会造成 valgrind
    的不当日志打字与印刷混乱,尽量减小 nginx 工作进度, 保持为 叁个。因为一般的内部存款和储蓄器错误其实和经过数目都以不曾提到的。

上边说了 valgrind 的功用和利用经验,但是 valgrind
也有二个百般大的欠缺,便是它会鲜明降低程序的品质,官方文书档案说采取memcheck 工具时,下落 10-50 倍。也便是说,如果 nginx 完全握手质量是
三千0 qps, 那么使用 valgrind 测试,质量就唯有 400 qps
左右。对于一般的内部存款和储蓄器难点,下落品质没啥影响,可是作者本次的内部存款和储蓄器泄漏是在大压力测试时才大概遭遇的,若是品质下降这么肯定,内部存款和储蓄器泄漏的不当历来检查和测试不出来。

老大测试请求的构造

压力测试工具和系统都准备好了,照旧不可能精确复现 core dump
的条件。接下来还要形成格外伸手的结构。构造哪些格外请求呢?由于新增的效果代码主假设和
SSL 握手相关,那几个过程是随后 TCP
握手产生的,所以很是也至关心器重要发生在这几个等级。于是本身着想构造了如下三种相当情况:

  • 十一分的 tcp 连接。即在客户端 tcp connent 系统调用时,一成 可能率直接close 这些 socket。

  • 不行的 ssl 连接。考虑三种情景,full handshake 第③阶段时,即发送
    client hello 时,客户端 1/10 概率直接 close 连接。full handshake
    第叁等级时,即发送 clientKeyExchange 时,客户端 百分之十 可能率直接直接关门
    TCP 连接。

  • 丰盛的 HTTPS 请求,客户端 一成 的央浼使用不当的公钥加密数据,那样
    nginx 解密时一定会破产。

内部存款和储蓄器泄漏

尽管如此缓解了 core dump,可是其它3个题材又浮出了水面,正是 **
高并发测试时,会并发内部存款和储蓄器泄漏,大约2个小时 500M 的典范。

core bug fix 小结

布局好了上述高并发压力至极测试系统,果然,几分钟之内肯定出
CORE。有了安宁的测试环境,那 bug fix 的功能自然就会快很多。固然此时透过
gdb 依然不方便人民群众定位根本原因,不过测试请求已经满足了触发 CORE 的标准,打开
debug 调节和测试日志也能触发 core dump。于是能够不停地修改代码,不断地 GDB
调节和测试,不断地充实日志,一步步地追踪根源,一步步地类似真相。最终经过不停地再度上述手续找到了
core dump 的根本原因。

其实在写总括文档的时候,core dump
的根本原因是怎么着已经不太首要,最要害的只怕消除难题的思绪和进度,那才是值得享受和小结的。很多场馆下,千辛万苦排查出来的,其实是2个十二分显眼依然工巧的一无可取。比如此次core dump 的最主因是:由于并未科学地设置
non-reusable,并发量太大时,用于异步代理总括的 connection 结构体被 nginx
回收并开始展览了初步化,从而致使不一致的风云中出现 NULL 指针并出 CORE。

gdb 及 debug log 成效太低

因为有 core dump ,所以那一个题材初看很简单定位。gdb 找到 core dump
点,btrace 就能了然基本的由来和上下文了。 core
的直接原因格外不难和宽广,全体都以 NULL
指针引用导致的。然而从函数上下文想不通为啥会冒出 NULL
值,因为这么些指针在原生 nginx
的风浪和模块中都以那样使用的,不应有在那个地点变成 NULL。

出于目前找不到根本原因,依旧先化解 CORE dump
吧,修复办法也格外简单,直接判断指针是还是不是 NULL,借使是 NULL
就径直回到,不引用不就完了了,那个地点以往肯定不会出 CORE 了。

这么的防守式编制程序并不提倡,指针 NULL 引用要是不 core
dump,而是直接回到,那么这么些错误很有大概会影响用户的拜会,同时那样的
BUG 还不知道怎么时候能揭露。所以 CORE DUMP 在 NULL
处,其实是拾分负总责和实惠的做法。

在 NULL 处再次来到,确实制止了在这些地方的 CORE,但是过多少个钟头又 core
在了此外三个 NULL 指针引用上。于是自身又两次三番加个判断并避免 NULL
指针的引用。正剧的是,过了多少个钟头,又 CORE
在了其余地点,就这样过了几天,作者直接在想干吗会现出有的指南针为 NULL
的情状?为啥会 CORE 在分化地点?为何自己用浏览器和 curl
那样的通令工具访问却绝非别的难题?

深谙 nginx 代码的同班应该很了解,nginx
极少在函数入口及别的地点判断指针是还是不是为 NULL
值。尤其是一对最重要数据结构,比如‘ngx_connection_t’及 SSL_CTX
等,在伸手接收的时候就做到了初阶化,所以不也许在一而再寻常处理过程中现身NULL 的意况。

于是乎小编越发迷惑,分明 NULL 值导致出 CORE
只是表象,真正的标题是,这几个首要指针为啥会被赋值成
NULL?那个时候异步事件编制程序的短处和复杂就爆出了,好好的贰个客户端的呼吁,从逻辑上应有是两次三番的,但是被读写及时间事件拆成了多少个片断。纵然GDB 能准确地记录 core dump
时的函数调用栈,不过却无计可施精确记录一条请求完整的轩然大波处理栈。根本就不知底上次是哪个事件的怎么着函数将以此指针赋值为
NULL 的, 甚至都不驾驭这一个数据结构上次被哪些事件选取了。

举个例证:客户端发送一个健康的 get
请求,由于互联网或然客户端表现,供给发送两回才马到成功。服务端第二次 read
没有读取完全部多少,这一次读事件中调用了 A,B
函数,然后事件再次回到。第三遍数据来权且,再度触发 read 事件,调用了 A,C
函数。并且 core dump 在了 C 函数中。那个时候,btrace 的 stack frame
已经没有 B 函数调用的音讯了。

为此通过 GDB 无法准明显位 core 的着实原因

那时强大的 GDB 已经派不上用场了。如何是好?打字与印刷 nginx
调节和测试日志。不过打字与印刷日志也很烦心,只要将 nginx 的日记级别调整DEBUG,CORE
就不能够重现。为啥?因为 DEBUG
的日志音信量一点都非常大,频繁地写磁盘严重影响了 NGINX 的习性,打开 DEBUG
后品质由几七千0直线下滑到几百 qps。

调整到任何级别比如 INFO,
质量就算好了,可是日志消息量太少,没有扶助。即便如此,日志却是个很好的工具,于是又尝试过以下格局:

 

1.针对一定客户端 IP 开启 debug 日志,比如 IP 是 10.1.1.1 就打印DEBUG,其余 IP 就打字与印刷最高级其余日记,nginx 本身就援救那样的配备。

2.停歇 DEBUG
日志,自个儿在有个别首要路径添加高级别的调节和测试日志,将调节和测试消息通过 EMETiggoG
级别打字与印刷出来。

3.nginx 只开启贰个历程和少量的 connection
数。抽样打字与印刷连接编号(比如尾号是 1)的调节和测试日志。

全部思路依然是在不显著降低质量的前提下打印尽量详细的调节和测试日志,遗憾的是,上述措施依然不能够辅助难题一定,当然了,在持续的日志调节和测试中,对代码和逻辑更是领会。

 

core dump 的调试

首先说一下 core 的缓解思路,首假使之类几点:

1.gdb 及 debug log 定位,发现意义相当小。

2.怎么着复出 bug?

3.构造高并发压力测试系统。

4.构造安居的尤其请求。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注