上班的第五百一十五天

最近服务器出现了一点问题,就是在开服的头一两天,人数较多时会导致登陆不上。

基于我处于空闲状态,这个任务就肯定是落在我头上了。

接到这个任务,我就在想,登陆不上,而且还没提示,肯定就是网关服务器的问题。接着便把可能发生的问题罗列了一下:

1、配置没有配好,导致人数超过了上限;

2、网关服务器负载均衡部分写得有问题,导致人数多了就奔溃了;

3、服务器物理机有问题,开的服数多,导致内存不够用;

4、网络线路抽风。

针对这几个问题,我问了运维一些问题,以及把出问题的log要过来看。首先,先确定物理机的配置:CPU是8核16线程,内存64G,最大网速10Gbps。然后运维告诉我,一般开4~6个服务器,内存使用率约为56%,CPU和网速使用率都非常低,这样就排除了问题3。然后游戏服务器出问题时,同一台物理机,只有一个服出问题,其他都没事,那就排除了问题4。接着运维还告诉我,配置已经从500人提到800人了,但是还是会出现这个问题,因而问题1也可以排除了。

好的,接下来就全身心研究负载均衡的问题了。

先大概说一下网关服务器的架构。

首先它是基于事件驱动模型设计的,简单点说,就是有一条主线程,循环处理各种事务,其中最重要的事务就是从消息缓冲区中提取消息,并处理之。那么这些消息从哪里来的呢?从另外的线程来的,叫WorkThread。

网关服务器启动时,发起了1条MainThread,用于不停地Accept底层IOCP建立的连接。连接建立起来后,就将该客户端的信息(socket什么的)放在一个自定义类WSAContent里面。WSAContent不仅保存了和客户端通信的socket,还有双缓冲区(一个读缓冲,一个写缓冲)。

发起1条SwitchThread线程,用于交换双缓冲区的内容。检测到读缓冲区已经空了,那么就把写缓冲区和读缓冲区的内容交换。如果读缓冲区不为空,那么就提取一条消息,调用IOCP相关的接口(一时忘了)把消息放到队列里面。

发起了CPU核数*2+2(+2是为了处理峰值并发量)条WorkThread,里面其实就是调用GetQueuedCompletionStatus()来获取SwitchThread线程放进队列里面的消息,如果消息没出错,就进行业务处理。

主要的框架就这样,那么说好的负载均衡呢?

其实就是在MainThread提到的WSACotent类,开启服务器时,就会创建和配置的Client数一样多(甚至会再多点,为了处理峰值并发)的WSAContent实例。每次Accept都会选取空闲的WSAContent实例来专门应付一个Client,这样就能够将每个客户端的独立开来处理了。

然而这并没有什么卵用!因为有些玩家操作少,有些操作多。当玩的人数多时,网关服务器的负载多了,处理消息速度就难免跟不上来,这时刻肯定会卡的。而玩家一卡的话,肯定就是不停地动来动去,那么负载压力就更大的。这时候处理不过来的消息都会被丢掉,有些重要的消息就不会被丢,但是双缓冲区都爆满了,肯定也是处理不了只能丢了。那么断线重连的消息肯定是没得响应了,就造成了断线后连接不上的现象。如果此时退出到登陆界面,在重新进入游戏的话,应该是可以进去的,但是无奈服务器处理不过来,要等待比较久才登陆得上。但是登陆是有时限的,连接上一段时间不操作,就会断开,那就造成了登陆不上的效果。那这么说来,就是还是可能登陆得上咯?是的,我看了log后,发现出现问题(登陆不上)的时候,在线人数仍然在增加。

那么说到底,怎么解决呢?个人觉得这个是服务器写得烂而导致的,尤其是在网络不好的情况下,屯了一大堆的消息,防抖动性太差而导致的。目前最好的解决方法就是把网关服务器关了再开,那就ok了。至于进一步的解决方法,我得要仔细想想,毕竟实在资历尚浅,重新写一个估计没那么容易。

明天就搜一些优秀的网关服务器来研究!

时间: 2024-12-20 20:44:59

上班的第五百一十五天的相关文章

上班的第五百一十九天

今天验证了两个问题. 第一,backlog是不是填多少都生效. 第二,主程说登陆不上的问题是因为listen的队列满了,导致新连接连接不上,这个说法是否成立. 针对第一个问题,我翻阅了一些资料,得知这些是由操作系统底层决定的,对此,我在macbook和windows7上面都做了如下的实验. 服务器端:创建socket->填写sockaddr_in结构体->绑定监听地址和端口号->listen(socket, SOMAXCONN)->while(true){ ;}->end 客

上班的第五百一十六天

今天我再次思考了那个网关的问题,然后我在想会不会是受到了SYN攻击呢? 何谓SYN攻击? SYN攻击是利用TCP协议3次握手的逻辑漏洞而发起的攻击.TCP连接建立3次握手,首先是客户端发起SYN包请求连接,服务器接收到之后会返回SYN+1包和ACK包给客户端,客户端接收到之后,会返回ACK+1包给服务器,那么连接就建立了.问题就发生在第3次握手,如果客户端不返回ACK+1包,服务器会怎么样呢?服务器会等待,等待超时后会重发SYN+1包和ACK包,重发一定数目之后才放弃这个连接. 如果模拟了很多客

上班的第五百一十四天

昨天晚上又没写了,因为昨晚真心太累了. 本来疝气发作就很难受了,还要给弟弟举办个生日party,真心累.然后我也看到了他的女朋友,对于她,家里人是很反对的.之前就吵闹了好几次,始终是觉得难以接受,至于原因,我就不说了. 从小就睡到大的老弟,突然间让我觉得有点陌生.不过仔细想想的话,我觉得他们会分开的,挺奇怪的,因为他总会重复我走过的路. 他跟我说,就是觉得那个女的对他很好,相比其他喜欢闹脾气的小姑娘,这个女生好太多了,所以他就打算和她走下去.我告诉他了,男生是很少会因为一个女生对他好而从一而终的

第五百一十天 how can I 坚持

今天开始接触新东西,maven,mybatis,总算开始搞点东西了. 又三天没和hx聊天了,不知道自己顾虑什么,时冷时热的,也是醉了. 明天好好弄弄工程,正确尽快搞起来. 还有今天带着权哥输一局,哎,太笨了,搞得都有点意志消沉了.哈哈... 还有小陈梦婷摔到了,希望没事吧.. 睡觉.

小刘同学的第一百一十五篇博文

和昨天的fetch_friend一样,朋友圈文章的request请求也都大同小异了. 同样是set修改过后的数据返回给list. 然后是vuex的写法,看起来的确像是老师说的很简单呢,几行代码就搞定了. 朋友圈文章的路由,还没有写完,其实今天主要是在写SQL-- 多表连接查用户为1的每条朋友圈里的点赞.评论的情况.   (图片被压的有点糊了,不过不是重点) 配了一下列名,然后过滤了很多数据-- 这样就比较明显了,其实还有一点SQL没写完-- 今天就写到这里了,还是只写了1个半小时的代码,考试只剩

一百一十五、脱离SAP本体,通过ActiveX读取SAP表中数据

一.Sap自带有客户端,但是非常之臃肿卡顿,可以利用ActiveX的方式,脱离Sap本体,来读取Sap表中的内容进行插入等操作,非常之方便.代码如下: 二.界面如下,输入好相关内容,点击登录,提示登录成功 三.点击读表内容按钮,可以读出来表内容 四.我们打开SAP的表,和我们读出来的对比一下,发现一模一样 非常之完美,有很大的想象空间. 原文地址:https://www.cnblogs.com/tianpan2019/p/11444016.html

HP大中华区总裁孙振耀退休十五天后九大感言

原文网址链接:http://club.tcjl.com.cn/?p=3861        一.关于工作与生活 我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很尴尬的.我见过的40岁附近的外企经理人大多在一直跳槽,最后大多跳到民企,比方说,唐骏.外企员工的成功很大程度上是公司的成功,并非个人的成功,西门子的确比国美大,但并不代表西门子中国经理比国美的老板强,甚至可以说差得很远.而进外企的人往往并不能很早理解

《万历十五年》的读后感作文4000字

<万历十五年>的读后感作文4000字:万历十五年,即1587年,距今已过去432年.在明朝276的历史中,这一年很平淡,并没有什么特别之处.黄仁宇的<万历十五年>一书,有别于其他的历史叙述方式,相当于把历史剖开一个横截面,像纪录片穿越过去一样,把当时的一位皇帝和五位著名的大臣,以一种群像式的叙事手法缓缓展开,从中折射出16世纪中国社会的完整面貌.历史是一堆灰烬,但灰烬深处有余温黑格尔.历史上奇葩的皇帝很多,在明朝尤其多,书中的所描述的万历皇帝,也算是一个.万历皇帝,明神宗朱翊钧,1

每周进度条(第十五周)

第十五周进度条   第十五周 所花时间 1h 代码量(行)  100 博客量(篇)  1 学到的知识 对图片的处理 在Android程序中加入图片