<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fjs的专栏]]></title><description><![CDATA[对每一个人微笑，不试图劝服他人，不因对人失望而愤怒，务实，低调，做自己]]></description><link>https://blog.youkuaiyun.com/fjs_cloud</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fjs_cloud]]></copyright><item><title><![CDATA[off time cpu profile原理（bcc/tools/offcputime.py）]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/116755172</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/116755172</guid><author>fjs_cloud</author><pubDate>Thu, 13 May 2021 16:57:10 +0800</pubDate><description><![CDATA[常见的profile都on cpu的，也即是程序在CPU上运行时候的情况，例如基于运行时的栈采样输出火焰图。还有一种profile概念，与上述的概念正好相反，记录的是放弃CPU的情况，它的用处一般是拿来查程序为啥吞吐，响应表现不佳，通过off cpu的数据可以定位程序都是什么原因放弃了CPU。

    要拿到on cpu的数据可能方式很多，但是要拿到off cpu的情况就需要从调度着手了，


...]]></description><category></category></item><item><title><![CDATA[ebpf初探，动态追踪golang程序]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/116326098</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/116326098</guid><author>fjs_cloud</author><pubDate>Sat, 01 May 2021 10:33:41 +0800</pubDate><description><![CDATA[文章内容基本上是https://blog.pixielabs.ai/ebpf-function-tracing/post/内容的复刻，对细节进行了补充完善
]]></description><category></category></item><item><title><![CDATA[记一个诡异的UDP问题]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/78804316</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/78804316</guid><author>fjs_cloud</author><pubDate>Thu, 14 Dec 2017 16:40:07 +0800</pubDate><description><![CDATA[游戏中使用的KCP来连接访问服务器，虽然是建立在UDP协议上，没有连接的概念，但是为了方便业务层维护，大多UDP协议都会模拟出一个连接的概念出来。。。我们的采用的方式是模拟了一套类似于TCP的握手机制， 
客户端发送sync1 
服务器返回sync2 
客户端发送sync3 
服务器返回syncf其中 sync1和syncf都是一个自己的握手数据包，但是在电信的移动网络环境，syncf数据包可能会丢]]></description><category></category></item><item><title><![CDATA[volatile在java与c++]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/73770572</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/73770572</guid><author>fjs_cloud</author><pubDate>Tue, 27 Jun 2017 09:43:18 +0800</pubDate><description><![CDATA[volatile 关键字，粗暴理解为读取，赋值都必须是进入主存。。。。


在java环境下，其内存模型  load, store等操作都是原子的（64位非volatile可以不是原子），
所以volatile修饰的变量可以用作一些标志开关。。。。




但是在c++环境下，由于没有load,store这些原子操作保证，所以无法直接用volatile来修饰一个bool来作为多线]]></description><category></category></item><item><title><![CDATA[记UDP协议在Windows下的一个小问题]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/72661009</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/72661009</guid><author>fjs_cloud</author><pubDate>Tue, 23 May 2017 20:22:00 +0800</pubDate><description><![CDATA[最近需要为公司的游戏服务端框架集成KCP协议，而且需要兼容pypy，所以需要用cffi对KCP进行一个简单的包装，本身这部分还是挺顺利的，但是测试的时候在Windows下却出现了比较蛋疼过的问题，
socket的读取经常会抛出异常，错误码是10054，UDP没有连接，怎么会有重置的错误码。。。、。


最后查到，其实这应该算是Windows的一个bug。。
加入我们用一个udp sock]]></description><category></category></item><item><title><![CDATA[Netty4.0.36使用入门]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/51476316</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/51476316</guid><author>fjs_cloud</author><pubDate>Sun, 22 May 2016 18:51:51 +0800</pubDate><description><![CDATA[以前曾经阅读过Netty的源代码，对其整体的IO，线程模型都还算是比较了解，但是感觉以前的东西都忘记了，而且当时读的时候也比较乱，所以这次准备再重新走一遍，因为5.0版本的正式版还没有出来，所以就选择了4.0.36final版本。。。


最开始还是先看看最简单的使用吧，做一个简单的http服务器，返回hello world


先创建一个Handler来处理读取的数据：
packa]]></description><category></category></item><item><title><![CDATA[weblogviewer的使用与实现]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/51152786</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/51152786</guid><author>fjs_cloud</author><pubDate>Thu, 14 Apr 2016 17:20:38 +0800</pubDate><description><![CDATA[系统代码地址：https://github.com/2225377fjs/weblogviewer
系统需求：
因为机器较多，偶尔需要在线调试一些东西，看看log状况，如果要上机器去看的话就比较麻烦，就希望能够开发一个能够支持在浏览器上实时tail查看日志的系统，能够配置和管理多个监控的服务器，同时希望系统是比较轻的，不要影响服务器上现有的应用。


最开始http://logio.or]]></description><category></category></item><item><title><![CDATA[gevent的resolver与线程池]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/50624075</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/50624075</guid><author>fjs_cloud</author><pubDate>Tue, 02 Feb 2016 15:41:48 +0800</pubDate><description><![CDATA[在网络编程中，有一些有的时候比较难处理的地方，尤其是在系统性能要求比较高的时候，
（1）类似于gethostbyname，getaddrinfo这些操作，不能阻塞
（2）connect方法也不能阻塞


不过一个优秀成熟的服务器系统都需要能够完美的解决这些问题。。。
gevnet应该算是吧，起码这些问题都得到比较好的解决。


在gevent中默认将会使用线程池来解决gethos]]></description><category></category></item><item><title><![CDATA[python多进程web服务器新思路]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/50481961</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/50481961</guid><author>fjs_cloud</author><pubDate>Fri, 08 Jan 2016 12:19:08 +0800</pubDate><description><![CDATA[python这种语言可能最让人诟病的就是它的语言执行效率比较低（当然，相对于ruby，python还算良心），多线程残废难以利用多核cpu，最开始写java多线程写的爽了，会非常不适应在python，没办法只有多进程的方法来搞了。在web服务器方面，python现在比较常用的方式有两种：
  （1）开多个进程，大家监听不同的端口，然后前面挂一个反向代理 
  （2）首先启动父进程，监听端口，然后启动]]></description><category></category></item><item><title><![CDATA[服务器进程间RPC长连接实现的思考]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/50355691</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/50355691</guid><author>fjs_cloud</author><pubDate>Sat, 19 Dec 2015 00:34:33 +0800</pubDate><description><![CDATA[服务器进程间RPC长连接实现的思考  最开始比较系统的接触rpc应该还是在支付宝实习的时候，当时给的任务就是利用netty写一个java的rpc框架，然后后期还有了接入config的需求，这应该算的上是自己比较全面的接触到类似于分布式，服务化等概念。  rpc只是一种概念，可以有很多种的实现方式，可以直接http来做，接触到很多公司后端服务之间的调用就是直接通过http来做的，这种实现的方式好处就太]]></description><category></category></item><item><title><![CDATA[gevent关闭socket操作]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/50242151</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/50242151</guid><author>fjs_cloud</author><pubDate>Wed, 09 Dec 2015 22:09:41 +0800</pubDate><description><![CDATA[最近在分析系统的时候，发现在压测的时候服务端出现了比较多的CLOSE_WAIT状态的tcp连接，
需要等一会才能消除掉。。。。
恩，CLOSE_WAIT状态的tcp状态是怎么出现的呢。。：


首先客户端首先调用的close方法，那么将会发送fin数据包给服务端。。。
服务端收到fin数据包之后，将会返回ack确认，然后服务器的tcp连接就进入了CLOSE_WAIT状态了，这个时候服务]]></description><category></category></item><item><title><![CDATA[python with语句与上下文管理器]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/46391237</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/46391237</guid><author>fjs_cloud</author><pubDate>Sat, 06 Jun 2015 20:32:42 +0800</pubDate><description><![CDATA[经常我们在设计API的时候会有这样的需求：
（1）用户从某个管理器中获取一个资源
（2）用户使用这个资源
（3）在使用完之后，需要将这个资源还给管理器


一般情况下，我们需要做两个接口：
get，和return
这样子有一种风险就是，在写业务代码的时候，忘记了将资源还回去。。。


但是对于python而言，由于加上了上下文管理，就可以避免这种问题。。。而且对于API的设计]]></description><category></category></item><item><title><![CDATA[Gevent的socket协程安全性分析]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45956339</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45956339</guid><author>fjs_cloud</author><pubDate>Sun, 24 May 2015 22:18:22 +0800</pubDate><description><![CDATA[一般讨论socket的并发安全性，都是指线程的安全性。。。而且绝大多数的情况下socket都不是线程安全的。。
当然一些框架可能会对socket进行一层封装，让其成为线程安全的。。。例如java的netty框架就是如此，将socket封装成channel，然后让channel封闭到一个线程中，那么这个channel的所有的读写都在它所在的线程中串行的进行，那么自然也就是线程安全的了。。。。]]></description><category></category></item><item><title><![CDATA[python源码分析----内存分配（2）]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45954923</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45954923</guid><author>fjs_cloud</author><pubDate>Sun, 24 May 2015 20:36:36 +0800</pubDate><description><![CDATA[上一篇说到了，在python的内存分配中两个非常重要的方法：PyObject_Malloc和PyObject_Free
在具体的来这两个方法之前，先要看看别的一些东西]]></description><category></category></item><item><title><![CDATA[python源码分析----内存分配（1）]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45851463</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45851463</guid><author>fjs_cloud</author><pubDate>Tue, 19 May 2015 23:21:18 +0800</pubDate><description><![CDATA[上面的一篇粗略的介绍了一下python的对象结构，这篇来分析一个非常重要的部分，内存分配。。。
好像自己看的源代码，只要是跟C语言相关的，都在内存处理方面做了相当多的工作。。。。例如nginx，它也有实现自己的pool，python当然也不例外。。。。

python在内存分配上面分成了4个层次吧。。。]]></description><category></category></item><item><title><![CDATA[python源码分析----对象结构]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45817883</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45817883</guid><author>fjs_cloud</author><pubDate>Mon, 18 May 2015 12:51:49 +0800</pubDate><description><![CDATA[在python中，所有的东西都是对象，整数是，方法也是，。。总之什么都是。。。。
在看python的代码实现中，可以随处看到指针类型：PyObject*，那么我们就先来看看PyObject这到底是怎么定义的吧：]]></description><category></category></item><item><title><![CDATA[python进程间传递文件描述符扩展库]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45815331</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45815331</guid><author>fjs_cloud</author><pubDate>Mon, 18 May 2015 09:48:21 +0800</pubDate><description><![CDATA[由于python本身的线程基本上比较残废，所以为了利用机器的cpu，就不得不用上多进程。。。
在游戏服务器的设计中，最为常见的方式是：
挂一个前端服务器，专门来维护与客户端的连接，然后将客户端的请求数据转发给后端服务器。。。

上面的方式是现在最为正统的。。。
但是自己因为环境的限制，需要做到对客户端透明，然后将后端的服务器转换成为多进程的。。。所以这里就只有用一点比较别扭的方法了，首先处理登录等一些常规的逻辑放在前端服务器，当进入放进进行匹配战斗之后，将客户端的socket连接直接交给后端服务器，然后进行]]></description><category></category></item><item><title><![CDATA[cython入门（hello cython）]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/45582063</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/45582063</guid><author>fjs_cloud</author><pubDate>Fri, 08 May 2015 16:51:41 +0800</pubDate><description><![CDATA[开始主要写python的东西了，写习惯了JAVA和node.js，现在最不能适应的就是这语言实在是太慢了。。。慢的让人受不了。。。不过确实也有很爽的地方，python确实简单方便


由于现在涉及到的东西想要在gevent上做一层扩展，使得socket描述符可以跨进程在gevent的loop上注册。。。
python的socket由于没有sendmsg这些东西，所以这里就只有用到cytho]]></description><category></category></item><item><title><![CDATA[cocos2d-x lua中class的定义]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/43907309</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/43907309</guid><author>fjs_cloud</author><pubDate>Sun, 22 Feb 2015 13:56:36 +0800</pubDate><description><![CDATA[在lua中要实现对类的定义一般都是通过metatable来做到的。。例如：
Fjs = {}

function Fjs:new(name)
	local out = {}
	setmetatable(out, self)
	self.__index = self
	out.name = name
	return out
end


function Fjs:sayHello()
	print(]]></description><category></category></item><item><title><![CDATA[一致性哈希概念与Python的简单实现]]></title><link>https://blog.youkuaiyun.com/fjs_cloud/article/details/40831925</link><guid>https://blog.youkuaiyun.com/fjs_cloud/article/details/40831925</guid><author>fjs_cloud</author><pubDate>Wed, 05 Nov 2014 20:55:10 +0800</pubDate><description><![CDATA[很早就接触了一致性哈希这概念，不过一直]]></description><category></category></item></channel></rss>