Submitted by gouki on 2013, September 14, 9:57 PM
我不知道别人是否和我一样喜欢记录点东西,但是我知道我必须要记,因为年纪大了,如果不记录下来,很可能什么都忘了。
(伤心,我大约写了将近3000字的内容。没了,说实话,让我再写,可能写的没有刚才全了,希望我还能写点什么吧)
这次thinkingo的聚会对我来说真的是记忆犹新了。不谈路上堵车2小时吧,在高架上完全不能动,导航里写的只要半小时的路径走了2个小时。且谈好不容易写的心得吧。因为蓝牙鼠标左键失灵导致我以为是程序死了。让我重启了两次电脑 ,而明明sablog上面写的自动保存成功,却其实只保存了上文括号上面的那一句话。果然是老了。电脑也不帮我了
OK,让我再来一次吧,今天三个议题和一个话题
1、astaxie 的 go在cdn项目中的应用。
开始看到这个话题的时候,我还在想,今天是不是会话题重复了,毕竟七牛也是做云存储和CDN的,但后来发现asta讲的内容其实是内容分发这一块的,他们用go重新实现了内容分发模块,而原来则是用BT协议实现的。基于BT协议,有两个小问题:1.有1%的情况下,服务器节点只能从中心服务器取到99%的数据就卡死了。2.BT的搜索是无序的,不会优先从本地局域网进行下载,而是随机从任意节点下载,带来的问题就是机房的带宽反而被BT协议占用了不少,浪费了不少的流量费(现在的修改过的各种类BT协议,都调整过了,比如迅雷就宣称,会优先在局域网中下载从而避免流量占用过多)
asta他们则用go写了个分发协议,即中心服务器向节点发起通知,他们会先根据节点的机器数来进行数据块下载的分配 ,比如一个20个数据块,分散到节点的4台机器上则可能是1~5在第一台,6~10在第二台下载,以此类推,每个节点的机器下载完毕后通知中心服务器。这样中心服务器就知道哪些机器下载了哪些数据块。然后再通知第一台服务器从第二台上下载6~10,从第三台上下载11~15,以此类推。也就是说该节点的互联网流量其实就只消耗了整体数据的一次下载流量。而以前四台服务器,就下载完整的包四次,现在只有一次,其他的都是内网流量了。
这让他们不但节约了流量,还加快了速度
2、邵天宇 介绍了工作中对go的应用
邵天宇 他们公司是做微博方面的应用,这玩意大家都懂,其实能够从微博里挖掘数据都往往都是那些4A公司,现在也有越来越多的工司也开始慢慢在做这方面的工作,只有做的越多,才能越了解数据。gopher介绍他用go实现以前用python的功能后,CPU和内存的占用率都明显下降,性能更高。
邵天宇 介绍了几个他们公司用的一些用户分群的算法,细化到后面就是图的应用。
邵天宇 还介绍了他们使用的全文索引,说有个国内版的,整合了:Elasticsearch + IK,然后再加上leveldb来做处理,性能还算不错,原来是用wukong + sego,可是wukong的索引是存在内存里的,一旦机器重启就啥也没了。最后不得已才改用Elasticsearch + IK 。。(下次我也可以尝试一下)
3、七牛的韩拓介绍了下七牛中的GO使用情况
用韩拓的话来说,go的程序占据了他们的核心代码 的99%左右,但并不代表他们只用go来做所有的事,这可是一件蠢事,所以他们还是用了很多解决方案,比如lvs+nginx来解决高可用性的问题。用memcached来解决数据缓冲的问题等等
当然他介绍的最多的是他们日志系统,除了程序日志外,还有他们的事务日志。程序日志是他们的底层,事务日志是在程序日志的再一层包装。他们用日志系统包围了他们几乎所有的程序。即在程序的处理外层是被日志系统包围住的,日志系统就是一个蛋壳。它几乎充当了其他语言的try/catch,避免程序崩溃(这是我的理解,希望没有理解错)。虽然性能上有一点损失,但得到了更完整的日志,既可以分析系统,也能够用来当作收费依据。因此这些性能损失完全能够接受
----
话题中,韩拓提起了GC,引得大家一番热列的讨论。认为GC实在不可控。为了避免GC消耗大量的时间,每个人都有一些自己的看法,其实这个话题之前在知乎上已经有人讨论过:
http://www.zhihu.com/question/21615032
- 先介绍下我的情况,我们团队的项目《仙侠道》在7月15号第一次接受玩家测试,这个项目的服务端完全用Go语言开发的,游戏数据都放在内存中由go 管理。
-
- 在上线测试后我对程序做了很多调优工作,最初是稳定性优先,所以先解决的是内存泄漏问题,主要靠memprof来定位问题,接着是进一步提高性能,主要靠cpuprof和自己做的一些统计信息来定位问题。
-
- 调优性能的过程中我从cpuprof的结果发现发现gc的scanblock调用占用的cpu竟然有40%多,于是我开始搞各种对象重用和尽量避免不必要的对象创建,效果显著,CPU占用降到了10%多。
-
- 但我还是挺不甘心的,想继续优化看看。网上找资料时看到GOGCTRACE这个环境变量可以开启gc调试信息的打印,于是我就在内网测试服开启了,每当go执行gc时就会打印一行信息,内容是gc执行时间和回收前后的对象数量变化。
-
- 我惊奇的发现一次gc要20多毫秒,我们服务器请求处理时间平均才33微秒,差了一个量级别呢。
-
- 于是我开始关心起gc执行时间这个数值,它到底是一个恒定值呢?还是更数据多少有关呢?
-
- 我带着疑问在外网玩家测试的服务器也开启了gc追踪,结果更让我冒冷汗了,gc执行时间竟然达到300多毫秒。go的gc是固定每两分钟执行一次,每次执行都是暂停整个程序的,300多毫秒应该足以导致可感受到的响应延迟。
300多毫秒,韩拓说他们遇到过是5秒左右,在线上运行的时候,gc停止了5秒左右。5秒对于我们来说没有什么,但对于一个做高可用的企业来说,已经是有点夸张了。
----
实在不想写了,很痛苦。之前写的全没了,就记录这么一点吧。(这次写的时候,居然又超时了,所幸我ctrl+s,保存了下来。天啊。。。我快崩溃了)
Tags: thinkinlamp, thinkingo
Go | 评论:0
| 阅读:14631
Submitted by gouki on 2013, September 14, 9:33 AM
前言
最近在项目中写了一个小型 的socket服务器,于是就需要PHPclient来向他发送和接收数据,但是这时带来的问题,如果php每次创建socket连接1是开销比较大,2是连接远程性能可能也不佳,于是进行了曲线过国的过程,在本地用go写了一个server,php只向本地发送数据,由本地的server长连接到socket服务器,这样开销就会小很多(之所以这样,是因为socket服务器需要登录验证,PHP如果为了发个包,每次都登录验证消耗太大)
过程
在用go写server的过程中,遇到了这种问题,原来用C写的server,我们担心C server接受数据慢或者担心并发不够,于是php在发送数据的时候,用的是shm_系列函数,但发现shm系列函数不太稳定,正常使用使用就会溢出。于是转成了msg_xxx系列函数,并调整了系统参数,使得发送和接收的最大队列提高了很多
但是go lang对msg_xxx支持的不好,首先他没有自带,其次在调用RawSyscall的时候(参考了hover给的c函数中的参数,结果是go可以msg_send,但不能msg_receive,总说参数长度不对),最后,其实我是不想用cgo啦。
最后我参考了“囧囧孙”的网站(www.jiongsun.com/2012/12/38.html),实现了一个udp server。当然在这之前,我已经实现了一个http server的方案,不过我觉得本地udp server的话应该会更快。
其实,我觉得本地如果操作同一个管道文件,应该会更方便更快,毕竟,只是php写go读(但因为对系统的底层了解不多,也没有找到相应过多的资料,就暂时放弃了。比如,我看到了php://fd/1之类的,但没有实际例子也没有过多的在那里看。怕浪费太多的时间 )
转变
其实转变就在昨天,asta的群里,有个名为“囧”的朋友发布了一个网站(https://github.com/xiaojiong/memcachep),并说明他的go server是按照memcache的协议标准来实现的,也就是说,PHP只需要使用new memcache('server','port'),连接上server,然后get/set就OK了。这让我突然之间豁然开朗。
是啊,我在远程服务器实现了socket server,那个socket server是为其他平台服务,我PHP连接是比较麻烦,但如果我专门现实了一个GET/SET的接口,PHP发送过去不就OK了?也不用PHP写socket_create之类的函数,也不需要php来担心一些其他可能发生的问题。甚至如果以后socket server有多台了,我这里也可以利用memcache的addServer来实现多台发送?(当然也要socket server实现)。性能?可能是会略有降低,但难道,本地一个go server/php udp连接就一定高吗?开的服务越多,环节越长,出错的概率就会越高,如果我只是单点直接向socket server发送数据,这样出错还是有据可查的
准备
昨天就开始准备重写原来的socket server了。
socket server上面要做的事情比较多:
1、转发PHP发来的各种消息
2、转发失败后需要发送apns通知
3、在发通知前,需要查询数据库中每个用户ID的token,并更新多少未读信息
之前的server只做了纯转发功能。准备再花上一段时间把它搞定。
Tags: memcahep
Go | 评论:0
| 阅读:13939
Submitted by gouki on 2013, September 13, 10:26 PM
最近听到supervisor的机会越来越多了,主要是因为越来越喜欢将程序放到底层去运行,但又需要守护程序来监控它,万一它挂了怎么办?如果为每个程序都写上这样的脚本,那得写多少啊?
结果,在最近的看到的网上的内容里,就看到一大堆人在说用supervisor吧。
1、Asta谢的《build-web-application-with-golang》:第12章:应用部署
2、还是Asta谢的beego框架:Supervisord
3、来自the5fire的:进程管理器supervisor的使用(django实例)
其实还有很多关于这样的内容,就不一一贴出来了。只是beego框架中的介绍会相对比较简单,所以可以拿来当教程,再加上我的程序可能也会趋向于使用go来开发,就转贴一下这篇博客吧,只有三步:
-
安装 setuptools
wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg sh setuptools-0.6c11-py2.7.egg easy_install supervisor echo_supervisord_conf >/etc/supervisord.conf mkdir /etc/supervisord.conf.d
-
修改配置 /etc/supervisord.conf
[include] files = /etc/supervisord.conf.d/*.conf
-
新建管理的应用
cd /etc/supervisord.conf.d vim beepkg.conf
配置文件:
[program:beepkg] directory = /opt/app/beepkg command = /opt/app/beepkg/beepkg autostart = true startsecs = 5 user = root redirect_stderr = true stdout_logfile = /var/log/supervisord/beepkg.log
Tags: supervisor
Linux | 评论:0
| 阅读:16405
Submitted by gouki on 2013, September 11, 11:34 PM
st2目前应该是快超越Editplus成为广大开发人员手中必备的编辑器了吧?在写go的时候,我也用上了它,而且也用了gosublime来做为辅助,虽然,无闻说只要按cmd+.,cmd+h,就可以进行跳转查看变量等,但我有dash,可以看任何语言,我该怎么配置?
其实官方有现成的例子,在这里,你也可以看到英文版:https://sublime.wbond.net/packages/DashDoc,我稍微中文化一下吧
1、打开st2的菜单:preferences -> package control -> install package,搜索dashdoc进行安装,安装完成后就可以使用了(dashdoc功能只支持mac)
2、将光标移到需要查询的变量的英文上,按ctrl+h,即会自动打开dash,跳转到指定函数(测试了一下,只要你文件名的后缀正确,你在dash里又安装了相应的文档包,dash还是可以直接认出来的)非常方便
以下是小小的例子,打开一个golang的程序,将光标移到函数名上:
按下ctrl+h,
OK,我们还想看这个函数的源码,点击右边的函数名(该功能是看具体文档来实现的,目前go的文档是可以这样看源码的,PHP的不行,其他的未知)
有没有感觉到,高端大气上档次?想知道dash还支持些啥 ,其实APP内部已经告诉你了:
其实appcode是用idea的核心的,所以appcode的plugin能够在idea系的软件上安装,比如phpstorm,安装后也就可以跳转了,具体按哪个快捷键,我就不告诉你了,自己安装一下就知道了
Tags: st2, dash, mac, phpstorm
Software | 评论:0
| 阅读:20806
Submitted by gouki on 2013, September 11, 5:55 PM
看到标题不要以为我是来介绍新品的,其实我是来吐槽的。
看changelog里,这里改进了很多,但居然有一个功能坏掉了。这个功能。。。。是我天天要用,几乎时时要用的功能。难道phpstorm的用户已到了纯OO时代?不再需要写else了??
else后面的大括号居然不再自动完成了。而且默认输入else的时候就是一个错误的红色(红色可能与我的配色有关)。实在让人受不了。
虽然这次有一些feture还算不错。
From the PHP side, this build delivers:
- Scope highlighting for PHP control structures – alternative syntax (WI-566)
- Type inference fixes (e.g. @return static[] now works as it should, WI-13242)
- Symfony Console standalone for Laravel and Doctrine (WI-18196)
- PHPUnit on Server fixes
- Traits-related inspections are introduced (class can’t extend trait, interface can’t extend traits)
- and more bug fixes and improvements…
但毕竟else认错也太不科学了。这应该算是一个低级bug了吧?
Tags: phpstorm
Software | 评论:0
| 阅读:17702