记一次服务端定时器问题的解决

定时器实现过程遇到的问题 原文转自:http://www.tanjp.com/archives/203(即时修正和更新) 定时器实现过程遇到的问题 在服务端的程序里,时间是一个很常用,几乎无处不在的变量。如果不正确使用时间,将会导致灾难性的数据错误。所以,正确使用时间非常重要! 怎样才算是正确使用时间? 首先,我们得知道在程序世界里面,时间有哪些值? 1、协调世界时,又称世界统一时间,世界标准时间,国际协... 阅读详情

最近遇到了一次服务端定时器性能瓶颈的问题,把解决过程在此记录一下,作为备忘。

首先是前一段线上项目连续导人,平均在线千人左右,随之服务器慢接口(>100ms)越来越多,一天能达到五位数。观察内存占用情况,不高,没有频繁old gc的情况。观察cpu占用率,达70%-90%。这个数据是比较高的,比一般同等人数在线的游戏高出不少。这说明出现这种情况不太正常,并不是单纯在线高需要分服务器的问题,可能代码中某部分存在性能瓶颈。

顺着这个思路,在慢接口中的关键节点加日志调试,发现运行时间长的是一段添加新定时器的代码。这段代码是按时间顺序,将定时器添加到保存列表的一个合适位置,执行过程中会加全局锁。怀疑是定时器数量太多时,这段代码执行慢。用Jstack查看线程状态,也侧面印证了这一点,多个线程都在等待这段代码使用的全局锁。仔细研读这段代码,发现它使用LinkedList来保存所有定时器,所以插入和移除的时间复杂度都是O(N)。考虑改成PriorityQueue,这样插入和删除都降为O(logN)。

新代码上线后,慢接口大幅度减少,cpu占用也降到20%左右。说明优化起到明显效果。

总结几点:

  1. Jstack真的很有用。除了可以看死锁,还可以看线程运行状态、锁竞争情况,多次Jstack下都在Runnable状态的代码往往是执行较耗时的。
  2. 做好日志监控。慢接口数量、平均响应时间、平均接口数据包大小、内存占用、cpu占用,这些一有异常,能够及时被通知到。主动接受监控报警,而不是被动接受玩家反馈。
  3. 一定要做好压测。为今后一段时间设立目标,按预估负载,尽量模拟线上真实情况。对于怀疑可能产生瓶颈的代码重点压测。做到早发现,早解决。
tcp中使用的定时器 定时器的使用场景主要有两种。(1)周期性任务这是定时器最常用的一种场景,比如 tcp 中的 keepalive 定时器,起到 tcp 连接的两端保活的作用,周期性发送数据包,如果对端回复报文,说明对端还活着;如果对端不回复数据包,就会判定对端已经不存在了;再比如分布式系统中,各个组件之间的心跳报文也是定时发送来维护组件之间的状态。(2)兜底功能一些不立即执行的任务的时间底线。 阅读详情

相关推荐

基于C#的Tcp服务端通信

本篇主要是分享基于.Net的tcp服务端通信方案。其中基于unity的tcp客户端通信会在这里分享。另外关于tcp粘包断包的处理将放在这里分享。 整体设计 如图所示一共采用了三层封装来处理整个服务端的逻辑。 首先最上层的TcpServerMgr可以被业务层直接创建,并且通过事件系统将服务器收到的来自客户端的网络消息分发到各个业务系统中去。 其次TcpServer负责了整个tcp网络通信的创建,监听建立连接,关闭,心跳超时等等处理。对于正常接收到的消息通过一个回调函数传递给TcpServerMgr

FlyToCloud的博客 3674

定时任务在本地可以执行,在服务器上无法执行的问题

定时任务在本地可以执行,在服务器上无法执行的问题背景和问题查看原因并解决问题总结 背景和问题 项目采用springboot为框架,需要有一个定时任务的功能实现,使用springboot框架自带的工具实现,具体实现很简单。我希望每天凌晨1点执行任务,本地实现是没问题的,但是,部署到服务器上却出现比预定的时间晚了12个小时才执行。 查看原因并解决问题 首先,本地可以执行说明,定时任务代码层面没有问题,,放到服务器上晚12个小时才执行,首先考虑的是时区问题,查看服务器时区没有问题,说明服务器时间是正常的,查看no

zhang1763532517的博客 4702

Linux多线程服务端编程学习(六):基于timerfd实现定时器

本篇文章源码的地址为:https://github.com/freshman94/NetLib 在这一节中,我们会实现一个定时器,为反应器EventLoop增加定时回调函数的功能。实现定时器的关键类有: Timer TimerQueue Timer类 Timer实现了一个定时器结点,其核心成员变量为: const TimerCallback callback_; Timestamp exp...

freshman94的博客 704

【问题解决】在服务器端配置了定时任务但是执行失败,本地直接执行脚本没有问题

本地脚本运行没有问题,cron执行不正确

qq_44801116的博客 898

visibilitychange事件实战:解决iOS/Android息屏导致H5定时器暂停问题

本文深入探讨了移动端H5开发中visibilitychange事件的应用,解决iOS/Android息屏导致的定时器暂停问题。通过分析不同平台的定时器行为差异,提供了一套基于visibilitychange的高精度定时器补偿方案,适用于电商秒杀、在线考试等对时间精度要求严格的场景,显著提升时间准确性和用户体验。

hhh00的博客 1065

微信小程序页面跳转后js定时器没有销毁的问题

微信小程序页面跳转后js定时器没有销毁的问题 现在有一个小程序,对页面数据的实时性很强,本来想用socket,仔细研究了一下,万剑不离其中,它是websocket。服务端不会用,所以使用了传统的http请求方式。 1.请先看官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework...

w1366352655的博客 842

Spring 管理定时任务时,服务器不起作用,解决方法。

最近做了一个定时发邮件的功能,之间遇到了几个问题,经过努力总算解决了!现在和大家分享一下! 我用的到环境是 Linux+Struts2+Spring+Hibernate+Tomcat6.0+ MySQL。 采用了 DBCP 连接池,用Spring 管理Hibernate的配置方案。 定时功能配置: [code="java"] ...

疯狂之吻 1377

ESP32驱动GC9A01圆形屏实战:Arduino平台LVGL移植与图像显示优化

本文详细介绍了在Arduino平台上使用ESP32驱动GC9A01圆形屏的实战指南,包括硬件连接、LVGL移植与图像显示优化。通过SPI配置、LVGL库安装和双缓冲机制等技巧,帮助开发者快速实现高效显示效果,适用于智能家居控制面板等应用场景。

weixin_29182481的博客 735

[踩过定时任务的坑] 布置了定时任务,结果发现时间到了,服务器上定时任务没有启动,咋回事?

服务器起定时任务踩过的坑

weixin_45961300的博客 664

GitHub 新手使用手册

理论说太多容易忘,来实践实践吧。

2501_90226046的博客 1053

(数字ic验证)从零开始的apb_watchdog验证模块搭建(一、功能介绍与环境搭建)

apb_watchdog验证模块搭建(一)文章目录 文章目录apb_watchdog验证模块搭建(一)文章目录前言一、apb_watchdog简单功能介绍二、测试平台环境搭建1.测试所用模板介绍2.tb与interface2.env与watchdog_pkg3.test与base_sequence4.Makefile总结——当前验证结构 前言 本文介绍了apb_watchdog验证模块的搭建过程与其具体代码,主要包括其中验证环境的构建,测试序列的发送与回归测试收集。主要运用systemvorilog与u

peop1e的博客 9738

服务端定时器的学习(一)

定时器在程序中无处不在,无论是硬件,还是网页,客户端,服务端等。在服务端上合理地使用定时器,能提高服务器的效率和稳定性,如定时清理缓存,在服务器高负载情况下,自动执行一些重要的任务等。定时器的数据结构多种多样,有根据触发时间排序的红黑树,最小堆,也有根据执行顺序的时间轮。服务端常与网络模块协同处理服务端常基于事件驱动业务开展服务端除了协同网络处理,复用系统调用Code。

冷崖的博客 996

Linux ELF文件解析:从file到readelf的完整工具链指南

ELF(可执行与可链接格式)是Linux系统中二进制文件的标准格式,定义了程序加载、内存布局和元数据组织方式。其核心原理在于通过程序头表描述执行视图、节区头表描述链接视图,实现代码与数据的结构化存储。这一格式的技术价值在于为程序调试、安全审计和性能优化提供了底层支持,尤其在动态链接、符号解析和内存保护机制中发挥关键作用。在应用场景上,系统管理员依赖ELF分析工具解决库依赖问题,安全研究员通过检查安全属性评估漏洞风险,开发者则利用反汇编进行代码调试。本文聚焦于file、readelf、objdump等工具链的

weixin_42691065的博客 635

react next服务端渲染(数据获取以及componentDidMount中的定时器问题)

一、前言 服务端渲染理论知识暂且不论,好处是利于首屏加载,以及SEO,具体详情可以去百度一下,因为在公司做了一个react项目,主要用于一个页面的展示功能,正好也使用一下服务端渲染,学习一下,vue用nuxt.js,react用next.js,琢磨了一段时间,用以记录,废话不多说,开始 二、前期准备 我们可以按照next.js官网一步步创建,这里使用create-next-app脚手架, 1)全局...

yuanqi3131的博客 1615

CAPL编程的催化剂——CAPLdll的实现

CANoe作为一款功能强大的总线开发及测试工具,不仅仅是因为其丰富的库函数,最重要的是其兼容了多种编程语言,可以实现灵活的开发,极大的解决了纯CAPL编程所带来的限制,如通过动态链接库(DLL)来实现复杂函数的编写,使其能够在CAPL中可以调用,下面将对DLL的实现进行分析。capldll.cpp这个文件初看相当复杂,从整体上来说,这段代码主要包含了两部分:自定义函数实现和回调函数定义,今天的主要任务是实现自定义函数,这里的函数定义与普通函数定义差不多,只是利用了CAPL的格式。在VS2017工程中打开。

车载控制器AutoSAR软件开发工程师 4648

PAT|中国大学MOOC-浙江大学翁恺-C语言程序设计习题集(更新中)

##2-0. 整数四则运算 时间限制:400 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 ...

小鱼波波波 6万+

服务端定时器技术理解(一)

服务端在一下业务场景下,需要用到定时器 1.⼼跳检测 2.技能冷却 3.武器冷却 4.倒计时 5.其它需要使⽤超时机制的功能 对于服务端来说,驱动服务端逻辑的事件主要有两个,一个是网络事件,另一个是时间事件。对这两种事件的处理有两种方式: 1.在主线程处理网络事件时,处理时间事件,例如ngnix,redis 2.网络事件和时间事件在不同的线程中处理,例如,skynet 第一种模式示例代码如下: while (!quit) { int now = get_now_.

lyt_dawang的博客 638

从数学到机床:RTCP背后的几何变换与工业实现

本文深入解析RTCP(Rotary Tool Center Point)技术在五轴数控加工中的核心作用,通过几何变换与运动学原理实现刀尖点跟随,确保加工精度。从数学基础到工业实现,详细探讨了算法架构、机床结构适配及精度保障方法,为数控系统开发和高效加工提供关键技术支撑。

jump7的博客 258

jQuery 一次定时器_记一次腾讯微信面试

2017年7月毕业至今,已经快两年了,这两年的的技术积累得到到底怎样呢?个人觉得,面试是检验技术的唯一标准。所以,决定准备一份简历,到顶尖的互联网公司试一下,广州这边,最好的公司,当然就是微信啦。正好有师姐是在微信的,所以把简历发给了她,同时,我自己也在boss直聘上投了一个岗位,但是后来尴尬的事情发生了:我的简历被微信的其他部门锁定了!就是 boss直聘 投递的微信开放平台岗位锁定了,所以,我就...

weixin_39987985的博客 133

数据服务:数据服务框架Magic-API 介绍及实践

接口快速开发框架 基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发 。在线页面快速开发平台 基于 vue 的在线页面快速开发平台,主要把所有的 vue 代码都改为在线配置,最终获得一个 json 格式的页面新一代爬虫平台 基于Java实现的新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。今天给大家安利一

GIS摆渡人 2063

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【定时器】定时器实现

定时器实现定时器应用定时器实现类型类型一、网络事件和时间事件在⼀个线程当中配合使用,例如nginx、redis类型二、网络事件和时间事件在不同线程当中处理,例如skynet;定时器设计接口设计要点数据结构选择红黑树最小堆时间轮单层级时间轮多层级时间轮 定时器应用 心跳检测 技能冷却 武器冷却 倒计时 每日/每周/每月 数值重置 其它需要使⽤超时机制的功能 定时器实现类型 对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件; 在不同框架中,这两种事件有不同的实现⽅式; 类型一

Leoh的博客 926

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

定时器的简单实现

定时器的简单

冯同学的博客 2950

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

webView脚本js定时器无限执行的问题

webView脚本定时器无限执行的问题 2017年3月 一、前言(问题提出) 2017年3月31日,开发人员在fiddler抓包自测过程中,发现页面停留在一个没有任何网络请求的页面时,fiddler显示不断有相同URL的网络请求,间隔大概5s。该网络请求在不断的销毁系统资源,增加系统的功耗。 二、问题原因 过程 通过步骤复现,当进入一个webView页面后,就算该WebView结束后(...

毕业生笔记的博客 1538

LLBC定时器与任务调度:精准控制服务端时间流的终极方法

在服务端开发中,精准的时间控制是保证系统稳定性和业务逻辑正确执行的关键。LLBC作为一个简洁高效的跨平台服务端开发框架,其定时器与任务调度模块为开发者提供了强大的时间流控制能力。本文将深入解析LLBC定时器与任务调度的核心机制,帮助开发者掌握服务端时间管理的终极方法。 ## 核心组件与架构设计 LLBC的定时器系统基于`LLBC_TimerScheduler`核心类构建,该类负责管理所有定时器

gitblog_07999的博客 423

vue3.x 40 服务端渲染

v3 服务端渲染

monian187的博客 942
上一篇: 如何使用UWA做游戏性能优化
下一篇: 从一条阿里编码规范谈线程池的使用
长三月
博客等级 码龄9年 228粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值