专栏首页九州牧云分布式服务调用问题处理总结

分布式服务调用问题处理总结

push发送延迟

业务特点:

运营push发送数量较大,发送时间密集,同一时间段调用baixin发送push的数量几十万上百万不等。

问题描述:

之前我们的push发送使用两个项目实现,分别是:

  • push项目:接收和处理push信息,调用baixin项目进行push发送
  • baixin项目:负责接收和发送push信息,将push分发给IOS和Android客户端用户

在运营push业务里,push项目使用线程数量为200的固定线程池发送push信息给baixin项目,发送很快,五分钟发送五十万左右的push,但是用户收到push信息很慢,查询baixin项目的日志发现,大量push信息阻塞在了baixin项目的线程池队列中。

原因——线程池太小

下游baixin项目的发送push信息线程池太小。

解决办法——扩大线程池:

将baixin项目线程池由100扩为500后,线程池处理push发送的速度明显加快,线程池队列堆积减少。

历史解决办法——两个简单限流措施:

  • 限制运营上传接收push的用户id文件为2M,一个文件约为20万用户id,并给push发送时间设置间隔,每次push的发送时间间隔为10分钟。
  • 发送10万push,使发送push的方法主线程睡眠十秒。

经验总结:

分布式环境中,一个应用调用另一个应用同时大批量集中处理任务时,要考虑另一个应用的处理能力,在采用线程池提高系统并发能力的同时,必要时候采取限流等措施保证其他应用的可用性。

磁盘满导致系统调用变慢

问题描述:

内网测试发送十万动态push,速度突然变慢,主要是磁盘IO影响。查看日志发现,push调用pushCenter正常,但是会出现SocketTimeOutException响应异常,发送速度很慢,二十分钟发送了两万条数据,正常10分钟处理十万数据。

原因:

pushCenter所在服务器的磁盘满了。

解决办法:

1、top命令查看系统负载: push服务器负载正常,pushCenter服务器5、10、15分钟系统负载数值在2.0左右,CPU空闲90%,内存使用不大。

top c M

2、查找最大文件:

查看pushCenter服务器磁盘空间,发现磁盘空间已满:

df -h

怀疑是日志文件导致的,接着去日志目录查找最大的日志文件:

find / -type f -name "*log*" | xargs ls -lSh | more

找到最大的日志文件后,使用rm命令进行删除。push调用pushCenter的速度变快。

经验总结:

分布式环境中,一个应用调用另一个应用变慢,要同时查看两台服务器的负载,Linux系统性能一般受CPU、内存、磁盘、网络四个指标影响,任何一项指标负载高都有可能导致服务器处理请求的速度变慢,可以借助于top、iotop、netstat命令查看这四个指标的负载。参考链接:Linux性能监测与优化命令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据之脚踏实地学06--Linux中的搜索与Vim

    在Linux的使用过程中,经常会碰到文件的搜索或文件内容的查询,如果你没有接触过find命令和grep命令,关于搜索或查询就很难推进了。还有另一个非常重要的操作...

    1480
  • 大数据之脚踏实地学04--在Linux系统中安装Java

    本期将基于《大数据之脚踏实地学03--Linux的常用文件级命令》的知识,分享如何在Linux系统中安装Java。可能你会问,为什么选择Java安装的分享,而不...

    1480
  • 它们的屠城史–木马技术发展趋势与回顾

    新的学期开始了,某大学网络管理专业三年级的同学们显得特别兴奋,这个学期的课程安排里终于出现了“网络安全”课程,一直对安全技术甚至黑客攻防手段感兴趣的同学更是对这...

    HACK学习
  • nodejs开发环境配置【1】-nvm的安装详解

    nodejs的版本升级相当快,不同版本之间存在了或多或少的差异,在切换版本的时候,如果不使用版本管理工具的话,需要卸载后再安装新的版本,浪费不必要的时间和精力。...

    挥刀北上
  • 如何处理生产环境Tomcat的catalina.out日志?

    随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日...

    lyb-geek
  • Docker实战

    2.容器不是虚拟化:运行在Docker容器中的程序接口和主机的Linux内核直接打交道,可以帮助使用已经内置到操作系统中的容器技术

    硬核项目经理
  • IDEA中一键部署项目到Docker?

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后...

    技术从心
  • 论OpenVZ与KVM的区别

    虚拟化技术已经发展了很久,经过了很多次的迭代,虚拟化技术可以将单个物理服务器分解为多个较小的虚拟专用服务器(VPS)。

    爱游博客
  • Debian 9解决SSH中文乱码

    debian广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Debian项目众多内核分支中以Linux宏内核为主,而且 Debian开发...

    爱游博客
  • 大数据之脚踏实地学02--远程连接与目录结构

    在上一期的脚踏实地学中,我们介绍了如何在自己的Windows系统中安装虚拟机和CentOS系统,这个操作相当于模拟了一台远程服务器(注意,这是模拟哦。土豪的你可...

    1480

扫码关注云+社区

领取腾讯云代金券