listen函数中的backlog字段

今天在公司无意间又拿redis-benchmark测了一下silly的IO并发性并与redis本身比较了一下。 发现在2000个client同时并发的情况下,性能只是Redis的30%的左右。 直觉上这很不正常,虽然silly所有的数据经过lua层时都需要malloc和memcpy,但最多性能上差个10%~20%就已经很可观了,绝对不可能差70%这么多。 通过不断的调整client的个数,我发现性能并没有明显随着client的数量降低而降低,而是在client个数到达某个值时突然降低的。 比如我自己测的数据是在491个client时,silly的性能与r……

SIGPIPE信号

昨天夜里实现了按行来切为数据包的协议, 今天就迫不及待使用resdis-benchmark来测试一下silly的性能。 结果发现到100000个请求左右时就有一定机率程序会默默的退出, 使用gdb看了一下, 是因为向socket写入数据时触发了SIGPIPE信号。 google了一下发现,当向一个已经关闭的socket第二次写入数据时,就会触发SIGPIPE。 但是我把所有的_socket_close都加了打印也没有发现问题。 最后偶然间发现,如果一个socket被对方关闭, 那么第一次write函数不一定返回出错, 但是第二次write却一……

linux下调试内存问题

因为linux下没有QQ,刚好我的mac mini在闲置, 于是尝试着在OSX下开发silly。 令人奇怪的是在我的linux机器下运行好好的程序, 在osx下只要client对着silly发送几个数据包就会导致silly直接崩溃, 调试半夜未果。 今天早上在地铁上我都甚至开始怀疑osx下的malloc库默认不是线程安全的, 但是地铁上查了一路依然不能确定。 到了公司后, info程序员还没到,我就又寻思着我那个bug, 在centos下又测了一次,依然无果。 不死心看了一下’男人’对malloc怎么说, 无意间看到lin……

linux下动态库的版本号

据说linux下的动态库管理机制可以避免微软件DLL Hell的问题. 今天抽了点时间研究了一下, 发现其实本质上是利用别名(soname)技术来实现的. 在编译so文件时, 通过参数-soname将别名传入链接器ld(gcc可通过参数-Wl来将-soname参数传入链接器), 那么生成的动态库文件中Dynamic section中的SONAME将会被填入输入的别名. 如果没有-soname参数, 则Dynamic section中将不会有SONAME字段生成. 当使用命令gcc -g -Wall -o main -L. -lver时, 在进行链接时, 链接器ld会首先去当前目录查找libve……

linux下动态库

今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念. 如代码所示libhi.so中有一个函数hello, 主程序main中有一个函数hi_out, 那么在main中调用libhi.so中的hello时,hello会自动找到main程序中的hi_output函数地址, 然后进行调用. 在感叹linux下动态库强大的同时, 对于其实现机制也产生了好奇. 经过一番努力终于在程序员的自我修养中第7.6.2章找到答案. “动态链接器在完成基本自举……

实现了一个coroutine

在学习了lua之后, 总算是搞清楚了颇为流传的coroutine是怎么回事. 我发现coroutine就是我一直希望使用的那种多任务处理方式, 即有线程的清晰抽象, 又可以避免锁带来的开销以及其他并发问题, 可以说是线程和异步处理的一个最佳折中点. 在大约一年前, 我一直在为不能控制多线程的调度而苦恼(那里还不知道在Windows下Sleep(0)可以暂时让出cpu的控制权), 我甚至试图使用状态机来模拟多线程以便我可以控制线程调度, 后来因为这个方法对于代码的可维护性来讲付出的代价太大, 最终没敢使用.……

POSIX线程中的条件变量与互斥量

在看到UNP第26章时发现对于linux下的线程模型还很不是非常了解. 翻到APUE的第11章, 发现POSIX线程中通用的两个线程交互与同步手段有互斥量和条件变量两种. 对于这两种同步手段我想了很久也没想到每种到底适用于哪些场景, 甚至于我觉得几乎mutex就够完成绝大部分线程同步功能了. 以前在写代码时都是自然而然的用出来了, 也从来没有认真总结过到底什么情况下使用Mutex, 什么下使用条件变量(类似Windows下的事件). 在google到这篇文章终于豁然开朗. 其实问题很简单, 也许换个描述方式……

~/.fvwm/fvwm.stroke

#strokes #window list without drag Stroke 0 0 R N WindowList #button 3 guesture with Ctrl starts programs in any context #"r" like guestures starts rxvt #Stroke N5456 0 A C Exec exec xkill #Stroke N65456 0 A C Exec exec xkill #Stroke N7414789 0 A C Exec exec rxvt #Stroke N7414759 0 A C Exec exec rxvt #Stroke N74147589 0 A C Exec exec rxvt #Stroke N7414756 0 A C Exec exec rxvt #Stroke N74156 0 A C Exec exec rxvt #Stroke N74159 0 A C……

~/.fvwm/.fvwm2rc

ImagePath +:/usr/share/icons:/usr/share/pixmaps:/usr/share/icons/hicolor/48x48/apps:/usr/local/share/fvwm/icons:$HOME/.fvwm/icons EdgeResistance 250 100 EdgeScroll 100 100 EdgeThickness 10 ColormapFocus FollowsMouse ClickTime 750 DeskTopSize 2x2 #忽略数字锁定键 IgnoreModifiers L25 # default Styles: Style * BorderWidth 5, HandleWidth 5, DepressableBorder Style * Icon kcmkwm.png Style * MWMFunctions, MWMDecor, MWMButtons, HintOverride Style * De……

我的debian下安装 spb16.3的经历

网上大多数都是在redhat系列机器的安装的,我始终不成功: 整了好几天总算能启动了: 额外的安装步骤如下:         1.安装csh,ksh         2. cd /usr ln -s /tmp tmp        3. cd /bin ln -s /usr/bin/basename basename        4.将教程中的 ./pubkey -d cdslmd -y 改成 ./pubkey -d cdslmd -fy       ……