- 博客(192)
- 收藏
- 关注
原创 off time cpu profile原理(bcc/tools/offcputime.py)
常见的profile都on cpu的,也即是程序在CPU上运行时候的情况,例如基于运行时的栈采样输出火焰图。还有一种profile概念,与上述的概念正好相反,记录的是放弃CPU的情况,它的用处一般是拿来查程序为啥吞吐,响应表现不佳,通过off cpu的数据可以定位程序都是什么原因放弃了CPU。 要拿到on cpu的数据可能方式很多,但是要拿到off cpu的情况就需要从调度着手了,...
2021-05-13 16:57:10 1160
原创 ebpf初探,动态追踪golang程序
文章内容基本上是https://blog.pixielabs.ai/ebpf-function-tracing/post/内容的复刻,对细节进行了补充完善
2021-05-01 10:33:41 1636
原创 记一个诡异的UDP问题
游戏中使用的KCP来连接访问服务器,虽然是建立在UDP协议上,没有连接的概念,但是为了方便业务层维护,大多UDP协议都会模拟出一个连接的概念出来。。。我们的采用的方式是模拟了一套类似于TCP的握手机制, 客户端发送sync1 服务器返回sync2 客户端发送sync3 服务器返回syncf其中 sync1和syncf都是一个自己的握手数据包,但是在电信的移动网络环境,syncf数据包可能会丢
2017-12-14 16:40:07 871
原创 volatile在java与c++
volatile 关键字,粗暴理解为读取,赋值都必须是进入主存。。。。在java环境下,其内存模型 load, store等操作都是原子的(64位非volatile可以不是原子),所以volatile修饰的变量可以用作一些标志开关。。。。但是在c++环境下,由于没有load,store这些原子操作保证,所以无法直接用volatile来修饰一个bool来作为多线
2017-06-27 09:43:18 1842
原创 记UDP协议在Windows下的一个小问题
最近需要为公司的游戏服务端框架集成KCP协议,而且需要兼容pypy,所以需要用cffi对KCP进行一个简单的包装,本身这部分还是挺顺利的,但是测试的时候在Windows下却出现了比较蛋疼过的问题,socket的读取经常会抛出异常,错误码是10054,UDP没有连接,怎么会有重置的错误码。。。、。最后查到,其实这应该算是Windows的一个bug。。加入我们用一个udp sock
2017-05-23 20:22:00 825
原创 Netty4.0.36使用入门
以前曾经阅读过Netty的源代码,对其整体的IO,线程模型都还算是比较了解,但是感觉以前的东西都忘记了,而且当时读的时候也比较乱,所以这次准备再重新走一遍,因为5.0版本的正式版还没有出来,所以就选择了4.0.36final版本。。。最开始还是先看看最简单的使用吧,做一个简单的http服务器,返回hello world先创建一个Handler来处理读取的数据:packa
2016-05-22 18:51:51 1645
原创 weblogviewer的使用与实现
系统代码地址:https://github.com/2225377fjs/weblogviewer系统需求:因为机器较多,偶尔需要在线调试一些东西,看看log状况,如果要上机器去看的话就比较麻烦,就希望能够开发一个能够支持在浏览器上实时tail查看日志的系统,能够配置和管理多个监控的服务器,同时希望系统是比较轻的,不要影响服务器上现有的应用。最开始http://logio.or
2016-04-14 17:20:38 5231 2
原创 gevent的resolver与线程池
在网络编程中,有一些有的时候比较难处理的地方,尤其是在系统性能要求比较高的时候,(1)类似于gethostbyname,getaddrinfo这些操作,不能阻塞(2)connect方法也不能阻塞不过一个优秀成熟的服务器系统都需要能够完美的解决这些问题。。。gevnet应该算是吧,起码这些问题都得到比较好的解决。在gevent中默认将会使用线程池来解决gethos
2016-02-02 15:41:48 1752
原创 python多进程web服务器新思路
python这种语言可能最让人诟病的就是它的语言执行效率比较低(当然,相对于ruby,python还算良心),多线程残废难以利用多核cpu,最开始写java多线程写的爽了,会非常不适应在python,没办法只有多进程的方法来搞了。在web服务器方面,python现在比较常用的方式有两种: (1)开多个进程,大家监听不同的端口,然后前面挂一个反向代理 (2)首先启动父进程,监听端口,然后启动
2016-01-08 12:19:08 2383
原创 服务器进程间RPC长连接实现的思考
服务器进程间RPC长连接实现的思考 最开始比较系统的接触rpc应该还是在支付宝实习的时候,当时给的任务就是利用netty写一个java的rpc框架,然后后期还有了接入config的需求,这应该算的上是自己比较全面的接触到类似于分布式,服务化等概念。 rpc只是一种概念,可以有很多种的实现方式,可以直接http来做,接触到很多公司后端服务之间的调用就是直接通过http来做的,这种实现的方式好处就太
2015-12-19 00:34:33 17076 3
原创 gevent关闭socket操作
最近在分析系统的时候,发现在压测的时候服务端出现了比较多的CLOSE_WAIT状态的tcp连接,需要等一会才能消除掉。。。。恩,CLOSE_WAIT状态的tcp状态是怎么出现的呢。。:首先客户端首先调用的close方法,那么将会发送fin数据包给服务端。。。服务端收到fin数据包之后,将会返回ack确认,然后服务器的tcp连接就进入了CLOSE_WAIT状态了,这个时候服务
2015-12-09 22:09:41 2728
原创 python with语句与上下文管理器
经常我们在设计API的时候会有这样的需求:(1)用户从某个管理器中获取一个资源(2)用户使用这个资源(3)在使用完之后,需要将这个资源还给管理器一般情况下,我们需要做两个接口:get,和return这样子有一种风险就是,在写业务代码的时候,忘记了将资源还回去。。。但是对于python而言,由于加上了上下文管理,就可以避免这种问题。。。而且对于API的设计
2015-06-06 20:32:42 953
原创 Gevent的socket协程安全性分析
一般讨论socket的并发安全性,都是指线程的安全性。。。而且绝大多数的情况下socket都不是线程安全的。。当然一些框架可能会对socket进行一层封装,让其成为线程安全的。。。例如java的netty框架就是如此,将socket封装成channel,然后让channel封闭到一个线程中,那么这个channel的所有的读写都在它所在的线程中串行的进行,那么自然也就是线程安全的了。。。。
2015-05-24 22:18:22 4198
原创 python源码分析----内存分配(2)
上一篇说到了,在python的内存分配中两个非常重要的方法:PyObject_Malloc和PyObject_Free在具体的来这两个方法之前,先要看看别的一些东西
2015-05-24 20:36:36 1793
原创 python源码分析----内存分配(1)
上面的一篇粗略的介绍了一下python的对象结构,这篇来分析一个非常重要的部分,内存分配。。。好像自己看的源代码,只要是跟C语言相关的,都在内存处理方面做了相当多的工作。。。。例如nginx,它也有实现自己的pool,python当然也不例外。。。。python在内存分配上面分成了4个层次吧。。。
2015-05-19 23:21:18 1603
原创 python源码分析----对象结构
在python中,所有的东西都是对象,整数是,方法也是,。。总之什么都是。。。。在看python的代码实现中,可以随处看到指针类型:PyObject*,那么我们就先来看看PyObject这到底是怎么定义的吧:
2015-05-18 12:51:49 1448
原创 python进程间传递文件描述符扩展库
由于python本身的线程基本上比较残废,所以为了利用机器的cpu,就不得不用上多进程。。。在游戏服务器的设计中,最为常见的方式是:挂一个前端服务器,专门来维护与客户端的连接,然后将客户端的请求数据转发给后端服务器。。。上面的方式是现在最为正统的。。。但是自己因为环境的限制,需要做到对客户端透明,然后将后端的服务器转换成为多进程的。。。所以这里就只有用一点比较别扭的方法了,首先处理登录等一些常规的逻辑放在前端服务器,当进入放进进行匹配战斗之后,将客户端的socket连接直接交给后端服务器,然后进行
2015-05-18 09:48:21 2001
原创 cython入门(hello cython)
开始主要写python的东西了,写习惯了JAVA和node.js,现在最不能适应的就是这语言实在是太慢了。。。慢的让人受不了。。。不过确实也有很爽的地方,python确实简单方便由于现在涉及到的东西想要在gevent上做一层扩展,使得socket描述符可以跨进程在gevent的loop上注册。。。python的socket由于没有sendmsg这些东西,所以这里就只有用到cytho
2015-05-08 16:51:41 1247
原创 cocos2d-x lua中class的定义
在lua中要实现对类的定义一般都是通过metatable来做到的。。例如:Fjs = {}function Fjs:new(name) local out = {} setmetatable(out, self) self.__index = self out.name = name return outendfunction Fjs:sayHello() print(
2015-02-22 13:56:36 5140
原创 python元类分析
刚开始接触到Python新式类中的元类的概念的时候很是纠结了下。。不知道这是个啥东西。。。用以下几个定义来说明吧:(1)Python中,类也是对象。。只不过这种对象比较的特殊,他用于创建别的对象(2)元类也是一种类,只不过它更特殊。。。他是用来创建别的类的类。。。(呵呵,是不是很拗口)
2014-11-03 19:39:06 1204 1
原创 Gevent源码之loop的实现
gevent之所以性能好,最主要就得益于对libev的封装,这里就来看看这部分具体的实现。。。稍微看一下libev的用法就知道,libev将各种事件都定义为了watcher,这里包括了定时,io等等。。在gevent主要就是对libev的loop以及watcher进行了封装。。这部分采用的是cython来写的。。
2014-09-09 15:27:05 3174
原创 Gevent的协程实现原理
之前之所以看greenlet的代码实现,主要就是想要看看gevent库的实现代码。。。然后知道了gevent的协程是基于greenlet来实现的。。。所以就又先去看了看greenlet的实现。。。这里就不说greenlet的具体实现了,关键就是栈数据的复制拷贝,栈指针的位移。。。因为gevent带有自己的I/O以及定时循环,所以它对greenlet又加了一层的扩展。。。
2014-09-02 18:29:36 9127 1
原创 python协程的实现(greenlet源码分析)
基本上读完了greenlet的源代码,代码不多,就2000行C语言的代码,其中有一部分栈寄存器的修改的代码是由汇编实现的。。。一句话来说明greenlet的实现原理:通过栈的复制切换来实现不同协程之间的切换。。。那么接下里来具体的来看看greenlet的代码到底是怎么实现的。。。
2014-08-25 20:46:13 9527 1
原创 支持并发的http客户端(基于tcp连接池以及netty)
闲来无事,将以前自己写的一个库放出来吧。。有的时候会有这样子的需求:(1)服务器A通过HTTP协议来访问服务器B(2)服务器A可能会并发的像B发送很多HTTP请求类似于上述的需求,可能并不常见。。。因为在业务中确实遇到了这样子的场景,所以就自己动手开发了一个库。。。
2014-06-22 18:05:36 8168 2
原创 linux下实现监控进程网络带宽
。。。nethogs。。。一个专门用于linux下监控各个进程的网络带宽的程序。。。所以就直接看了下他的代码实现。。。代码不是很多吧。。。c++写的。。。而且很简单。。。这里就不具体的说这部分的代码了。。。直接来说一下功能实现的原理吧。。。。
2014-06-06 16:42:19 6456 1
原创 Tomcat源码分析之:ServletOutputStream的实现
在tomcat8中已经完全支持非阻塞的方式接收以及发送数据了。。。。但是比较遗憾的是,以前遗留下来的太多的老代码都不支持这种新的方式来发送数据。。。木有办法。。。这里来看看Tomcat中是如何实现ServletOutputStream的吧。。。。在具体的来看它之前,这里先来一张图来描述一下Tomcat的数据发送时候的流动。。。
2014-04-17 16:17:53 8874 2
原创 java类库concurrent中最核心类型AbstractQueuedSynchronizer的学习
首先,concurrent类库在java中应该算是非常重要的类库了,在构建一些同步代码,容器,并发什么的都可以在这个类库中找到现成的可以用...而在这个类库中最最核心的一个类型就是AbstractQueuedSynchronizer类型,可以基于它来实现自己的同步工具,例如ReentrantLock类型其实就是基于它来实现的...
2014-03-30 21:00:52 1317
原创 Tomcat源码阅读之底层IO封装(1)InternalNioInputBuffer的分析
最近读代码的节奏很慢,。。在HttpPrcoessor部分已经停滞了挺久的时间了。。可能它设计到的东西还是挺多的吧。。。今天写的是InternalNioInputBuffer类型的分析,它算是Tomcat对IO封装部分的一个十分重要的环节了,可以将其理解为用于沟通底层socket与上层servletInputStream的中间层。。。而且InternalNioInputBuffer中还实现
2014-03-28 15:44:16 3142
原创 Tomcat源码阅读之闭锁的实现与连接数量的控制
嗯,今天其实在看HtttpProcessor的实现,但是突然想到了以前在看poller的时候看到了有闭锁,用于控制当前connector的连接数量,嗯,那就顺便把这部分来看了。。。在Tomcat中,通过继承AbstractQueuedSynchronizer来实现了自己的同步工具,进而来实现了一个用于控制连接数量的闭锁。。LimitLatch。。这里就需对AbstractQueuedSynchronizer有一些初步的了解。。。
2014-03-25 19:57:53 3022
原创 Tomcat源码阅读之StandarWrapper源码分析
StandarWrapper,嗯,其实可以将其理解为对servlet对象的包装。。。先来看看简单的继承结构吧:这里的继承体系还算是比较简单吧,首先是继承了ContainerBase,让StandarWrapper有了基本的对Container的管理能力,其实是先了ServletConfig接口,这个接口应该比较熟悉吧,在servlet的初始化的时候,传进去的就是这个参数,另外就是还有实现了Wrapper接口和NotificationEmitter。。。从前面可以知道,Wrapper对象是在Context
2014-03-24 20:34:46 1653
原创 netty开发基于长连接的http客户端
今天遇到了一个广告网络比较现实的需求,如下:最为一个广告服务端,可以从publisher的app接收到很多的加载广告的请求。。。这个时候可以将这些请求的数据发给一些中间的机构(exchange),然后由他们返回广告的数据。。。因为请求量较大,而且要保证延迟不能太高,所以这里与这些中间机构进行通信的时候就只能采用长连接的方式了,不能每次请求都生成一次连接来进行http请求。。。其实以前一般用netty开发都是作为服务端来的,很少用作客户端。。。在网上找了一下代码,好像找不到类似立马可以用的,没办法了,只有
2014-03-19 19:42:15 14994 3
原创 Tomcat源码阅读之Mapper分析
Mapper对于Tomcat或者jetty这种应用服务器来说应该算是非常重要的一个东西了。。首先来说它是干嘛用的,听名字就基本上能猜出来,对于请求,对这个请求进行路由,交给应该负责处理这个请求的最终代码就是Mapp而应该干的或。。对于servlet来说,对应的就是一次http请求该交给哪一个servlet来处理。其实以前在看jetty的代码的时候就相当于看过了一种实现的方式,jetty采用的是一种类似于tries(字典树)的查询来进行请求的路由。。。感觉还算是蛮不错的吧。。毕竟字典树在做基于字符串的查
2014-03-18 21:28:21 2781
原创 Tomcat源码分析之ClassLoader部分的设计详细分析
读Tomcat的源码也算是有一段时间了吧,感觉读的也是断断续续的,这次写一篇比较综合性的吧,来看看Tomcat的整体ClassLoader体系的设计。。。。在具体的涉及到源码之前,先来一张图来整体的描述一下整体的结构吧:
2014-03-16 19:35:29 3686
原创 Tomcat源码分析之Context的创建与启动分析
在前面的文章中,知道在HostConfig对象中,会在host启动的时候开始部署当前host下面的web应用程序,一般情况下就是扫描webapps文件夹,然后为每个web应用程序创建Context对象,一般情况下也就是StandardContext。。这里其实一个Context也就代表了一个web应用程序,它具体来维护应用程序定义的servlet,filter,资源。。。但是这里由于Con
2014-03-15 20:48:30 2566
原创 Tomcat源码阅读之StandardHost与HostConfig的分析
前面的文章分析了StandardEngine,这里来分析一下由Engine对象来管理的另外一种对象吧:Host。。一般情况下,在tomcat中都是默认使用StandardHost类型。。。这里先来看看在catalina是如何配置创建StandardHost对象的吧:
2014-03-12 19:40:22 2165
原创 Tomcat源码阅读之StandardEngine分析与Valve的设计
在上一篇的文章中看了StandardService的实现。。。这里可以将它要做的事情总结如下:(1)管理其拥有的container对象,以及其拥有的connector对象,同时service只能有一个container对象,可以拥有多个connector对象。。。(2)StandardService对象同时还要处理request的map问题,它有maplistener和mapper,maplistener用于监听container对象,从而增加mapper里面的信息。。。
2014-03-10 15:42:09 2027
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人