月度归档: 2014年03月

C语言算法-单链表的反转/逆序算法

平时的工作中通常会使用双链表进行链式的数据存储或是一些更高级的数据结构的构建(比如:栈、队列等),双向链表的正向、逆向遍历已经非常容易,而且系统库已经为我们构建好了非常高效的链表对象,比如著名的Linux内核链表对象:struct list_head,提供了非常丰富的链表操作方法。 如果从单纯的数据结构、算法实现角度讲,单链表也有很多值得研究的地方,今天介绍两种对单链表进行反转/逆序的算法: 1. 原地进行节点的反转/逆序 2. 从第三个节点开始,依次插入到头结点之后,并再将头节点移动到表尾 链表结构的定义,采用最简单的方式,数据单元直接采用整数对象进行数据存储,并且采用无 […]

[阅读全文...]

降低Nginx代理服务器的磁盘IO使用率,提高转发性能

目前很多Web的项目在部署的时候会采用Nginx做为前端的反向代理服务器,后端会部署很多业务处理服务器,通常情况下Nginx代理服务器部署的还是比较少,而且其以高效性能著称,几万的并发连接处理速度都不在话下。 然而去年的时候,我们的线上系统也采用类似的部署结构,同时由于我们的业务需求,Nginx的部署环境在虚拟机上面,复用了其他虚拟机的整体磁盘,在高IO消耗的场景中,我们发现Nginx的磁盘写入消耗还是很明显的,而且到了影响其他服务的情况。 发现问题的过程很曲折,开始的时候我们并没有怀疑到是Nginx的问题,一直在排查我们的业务处理服务程序,检查为什么会带来如此多磁盘消耗, […]

[阅读全文...]

在C程序中内嵌Python解释器,用脚本语言实现灵活的Plugin机制

在经历过的一些大型项目中,很难独立使用一种开发语言完成任务,由于我这边的业务项目通常以服务器方面居多,从项目周期和运营维护角度考虑,既要考虑到程序的性能,又要考虑到业务功能变更和维护的便利性。 很多时候,我们都会以Python进行框架开发,在一些涉及到性能要求的时候以内嵌C模块的形式进行扩展,以提高整个项目的执行效率。然而我们还有很多以C语言开发的服务器项目,通常使用Prefork、MPM等多进程或多线程的框架,那么怎么才能做到灵活的对这些服务器程序的业务扩展或是Plugin功能呢? 以前在纯C语言时,我们通常采用so lib或是dlopen的方法,这样每次增加或是调整业务 […]

[阅读全文...]

网络服务器-解决服务器大量TIME_WAIT而无法访问的方法

前段时间我在进行线上项目压力测试的时候,遇到了一个吞吐量的性能问题,当时我的Server和Client之间的通信协议采用了Json Over HTTP的方式(并且在同一个机器上面,其实应该是出现在Client的那个机器上),而且由于Client的实现原因,没有任何KeepAlive机制,同时必须有大量的请求,这样就造成一个问题,客户端的请求端口会迅速被使用完成,然后系统会有大量的TIME_WAIT,整个系统再也分配不出新的端口给任何程序(包括Client)使用,任何新创建连接时,都会报错,即:”Cannot assign requested address”,经 […]

[阅读全文...]

Python工具库-构建纯python的iconv编码转换函数库

背景: 日前遇到一封Apple Mail客户端发出来的邮件,字符集居然是 ISO-2022-CN,无奈Python2下面decode不支持,找了一圈,没发现iconv的python库(找了一个,不太好使),只好自己动手丰衣足食,以ctypes的方式,封装一个基于libc的iconv方法。 源码:

[阅读全文...]

网络服务器-Loopback (Internet Sockets) VS UNIX Domain Sockets

在本机的进程间通信中,TCP和UNIX域套接字是两种比较简单方便的通信方式,TCP基本以回路地址形式表现,回路地址在本机通信上还是要比UNIX域套接字多了封包/解包/校验和/序列确认等操作 那么对于这两种方式的性能比较可以参考以下文章: http://bhavin.directi.com/unix-domain-sockets-vs-tcp-sockets/ http://lists.freebsd.org/pipermail/freebsd-performance/2005-February/001143.html 同时做了一个简单的对比测试,虚拟机上(1CPU、256M […]

[阅读全文...]

Python下使用qrcode模块生成vCard电子名片二维码图片

随着微博、微信、O2O的繁荣发展,现在二维码的使用频率越来越高,初步尝试了一下,现在考虑是不是接下来专门做一个服务,为企业邮箱的客户直接生成二维码的电子名片签名,这样也可以提升一下用户气质。 首先下载python-qrcode模块,通过setup.py进行安装 示例代码如下:

[阅读全文...]

Linux下快速搭建SVN服务管理项目源代码

SVN是比较流行的源码管理软件(当然现在更流行Git,^_^,我比较习惯SVN,过几天发个Git的搭建方法) 1. 安装Subversion服务器 目前基本在CentOS下直接使用yum安装(也可以自己下载最新的svn源码,编译安装,在此略过),以下全部使用root权限 2. 创建服务器端源码根目录 3. 修改SVN项目配置文件 注意:配置项前面不能有空格 4. 启动svn服务器 注意:如果有多个项目,svn启动时指定所有项目的父目录即可,同时可以将启动命令加入 /etc/rc.local 系统自动启动 5. 构建项目 通常SVN源码目录会包含三个目录:trunk tags […]

[阅读全文...]

邮件服务器-POP3服务器邮件索引/UIDL简单、高效的缓存方案

对于POP3服务器来说,最重要的衡量标准就是单台服务器所能承担的用户服务,这其中会涉及用户并发数、网络带宽流量等因素影响。 POP3服务目前在国内的企业邮箱应用里面是一个比较普及的功能,毕竟outlook、foxmail客户端做的确实很不错,而且这么多年的用户习惯,还是习惯把邮件拉到自己的本地办公电脑上来操作和查找,当然,为了在多地点的访问,用户又习惯在服务器保留副本,至少在出差或是家里还是可以通过webmail来处理一下邮件,毕竟不能总是背着办公电脑跑,其实这就带来一个问题,用户的 UIDL 列表会很多,在10W这级别算是正常(关于降低 UIDL 列表,也有两种方案,以后 […]

[阅读全文...]