Anfield

You'll Never Walk Alone!


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

利用火焰图排查热词服务性能问题

发表于 2019-08-20 | 分类于 性能优化 | | 阅读次数:

问题背景

最近在配合研究部门重构ezmt,顺手把热词服务训练相关的模块进行了重构(其实接手这个服务捋清了逻辑后早就想重构了,这次正好趁机搞一下)。在联调结束后,用wrk压了一下性能,结果大跌眼镜,开了6个worker, 但是提高压测的线程数和连接数,QPS始终不见上涨, 几轮压下来QPS只有16-17左右,随着压力的上升,timeout现象非常严重。

于是单独对上游的ezmt热词训练服务压了一下,QPS在29左右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[[email protected] /home/aidu35/work/third/wrk]$ ./wrk -t 2 -c 10  -d 30s --latency  -s scripts/hotword.lua http://10.12.8.19:8001
Running 30s test @ http://10.12.8.19:8001
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 341.88ms 46.86ms 520.05ms 69.14%
Req/Sec 15.19 6.48 40.00 89.67%
Latency Distribution
50% 341.40ms
75% 373.19ms
90% 403.02ms
99% 451.30ms
875 requests in 30.06s, 0.92MB read
Requests/sec: 29.10
Transfer/sec: 31.17KB

难道是重构后性能下降明显?于是我们将版本回退为重构前的版本又压测了一遍QPS还不到10

进入容器查看了一下压测时的情况,实际cpu和内存的占用都非常低,这种情况,怀疑有很大可能是网络进程中出现了阻塞调用,于是准备抓取网络进程的off-cpu火焰图。

阅读全文 »

CLOSE_WAIT 填坑

发表于 2019-08-09 | 分类于 编程语言 | | 阅读次数:

前一阵加了一个活跃连接数的监控,顺手发现了服务里一个协程泄露的坑,后面看了commit记录这个bug从这个项目开始就一直存在了。。。

0x0 背景

最近在ddsserver上加入了客户端活跃连接数的监控。这个服务是一个使用openresty开发的项目,连接数监控有现成的nginx c module,加入参数 –with-http_stub_status_module 重新编译openresty后在nginx.conf加入

1
stub_status on

在lua代码中直接可以访问这个内置变量 ngx.var.connections_active 来获取当前的连接数,将这个变量集成进prometheus监控里

1
monitor_logger:set("metric_connections", ngx.var.connections_active, {"active"})

在本地测试没有问题后就美滋滋地更新到线上了。

阅读全文 »

rsync cache之坑

发表于 2019-07-17 | 分类于 linux | | 阅读次数:

0x0 背景

我们的网站平台上提供了可定制的语言模型功能,用户在使用定制工具定制完成后,这些模型需要让语音识别服务能够访问到。
为了识别服务能够更快的加载这些资源文件,我们需要将资源同步到每台部署有语音识别服务端物理机器上。

我们快速搭建了一套同步的服务,就是上一篇中提及的resync-server,resync-broker和resync-agent。 我们在每台需要在本地使用这些资源的机器上启动了一个resync-agent,它的作用是实时地将定制平台上新产生的资源拉到本地。

阅读全文 »

一次OR timer使用不当导致的内存问题记录

发表于 2019-07-15 | 分类于 编程语言 | | 阅读次数:

好久没更新博客了, 前一阵踩了一个openresty中使用timer的坑,特此记录一下。

0x0 背景

团队6月份在规划华北机房的事情,运维同事在华北部署了一套resync-broker 和 resync-agent, broker挂在了华东的server下面, 恰好华北机房内跑broker的机器只有8G内存,在运行一段时间后,容器直接OOM了。

阅读全文 »

/proc/[pid] 目录文件详解

发表于 2019-03-25 | 分类于 linux | | 阅读次数:

proc是一个伪文件系统,它被用作内核数据结构的接口,通常被挂载在/proc上,大部分文件都是只读的,但是有一些文件允许内核变量修改。

阅读全文 »

golang的多态

发表于 2019-01-07 | 分类于 编程语言 | | 阅读次数:

多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都支持这种类型的值。

如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值。

go语言的接口采用鸭子类型的思想(如果走起路来像鸭子,那么它就是鸭子),实现时不需要显式的声明实现了什么接口。下面的Cat和Dog的实现是一个例子:

阅读全文 »

gin笔记

发表于 2018-12-27 | 分类于 编程语言 | | 阅读次数:

gin.Default() 默认带有中间件(日志和恢复)的路由
gin.New() 不带中间件的路由

router.GET/POST/PUT/DELETE …

martini restful风格

阅读全文 »

fcntl与文件锁

发表于 2018-11-05 | 分类于 编程语言 | | 阅读次数:

最近要加一个文件同步的服务,以daemon的方式部署在每台机器上,其他服务进程如果需要访问本机磁盘文件时,如果访问不到需要告诉文件同步服务去远端服务器把文件同步过来,同步文件的服务我们直接对rsync做了一层包装,文件同步存在一个中间状态,即文件已经存在但内容还没同步完成,这个中间状态时其他的进程不能来读取文件,这里我们使用了建议性文件锁来协调进程间文件的读取。

文件锁(File Lock)是一种在特定的时间内只允许一个 进程进行访问文件的机制,通过使用文件锁,可以使得多进程访问文件更加安全

阅读全文 »

Python 列表解析器&生成器表达式

发表于 2018-10-15 | 分类于 编程语言 | | 阅读次数:

列表解析器

It can be used to construst lists in a very natural, easy way, like a mathematician is used to do.

1
[expr for iter_var in iterable if cond_expr]

这个语句的核心是 for 循环,它迭代 iterable 对象的所有条目。前边的 expr 应用于序列的每个成员,最后的结果值是该表达式产生的列表。迭代变量并不需要是表达式的一部分

阅读全文 »

修改openresty日志中打印的文件名

发表于 2018-09-25 | 分类于 编程语言 | | 阅读次数:

0x0背景

在基于openresty的项目中文件按照一定规则进行组织,类似下面:

1
2
3
4
5
6
[[email protected] or_demo]$ tree src/
src/
├── bar
│ └── api.lua
└── foo
└── api.lua

最后对应到业务逻辑的文件名称很可能是一样的,这时如果我们在代码里记录了一些日志,最后在日志文件中打印出来的文件名都是同一个。但是实际上,这些日志来源于不同文件夹下的文件,我们需要能够在日志中一目了然的看出来打印自哪个文件。

阅读全文 »
12…6
gerrard

gerrard

代码搬运工

58 日志
13 分类
57 标签
RSS
GitHub CSDN Weibo E-Mail

今日诗词:正在加载今日诗词....


© 2019 gerrard
本站访客数:
由 Hexo 强力驱动主题 — NexT.Pisces v5.1.4