- 博客(24)
- 资源 (2)
- 收藏
- 关注
原创 旧版glibc兼容旅程
一.背景在新环境编译程序部署到老环境运行。为什么不直接在老环境里面编译?因为用到了一点c++11的特性,需要较高版本的gcc进行编译;老环境默认的gcc版本太低,新版gcc的rpm包安装部署不上(glibc版本太低),源码安装高版本gcc又太麻烦。二. 错误表现注: server名字做过修改, 暂且叫my_server. 运行时报错,找不到GLIBC_2.14的符号:
2016-04-11 18:27:58
11952
2
原创 udp connect偶发失败的问题定位
问题表现程序“重启”的时候偶发性失败,表现在udp connect失败,但是如果成功启动,则程序运行完全正常。 失败时出现coredump,表现为断言失败:(gdb) bt#0 0x00007ff031e28f45 in raise () from/lib64/libc.so.6#1 0x00007ff031e2a340 in abort () from/lib64/l
2014-10-10 17:26:22
2399
原创 服务器编程的一点心得
由于水平有限,以下仅仅是个人的一些心得,希望对新人有一点参考作用。另外由于时间关系,写得有点杂,有些点可能并不是跟服务器编程强相关的。性能相关1. 应用各种pool。a) Mempool比如为了提高内存分配效率,可以使用Mem pool。当对应的场景简单时,可以自己定制私有的内存池管理。当内存池设计相对复杂的时候,可以考虑直接使用jemalloc、tcmallo
2014-09-06 00:10:48
1093
原创 tcp端口探测脚本 问题分析
【背景】最近在优化一个监控模块里面的dns解析功能,原来的做法是用旁路线程调用getaddrinfo去同步解析,解析实时性非常差,所以决定将解析改成异步执行。网上搜索了一些dns异步解析的库/接口, 大致有:getaddrinfo_a 、adns、c-ares、udns等等。这些库虽然功能相对比较全,但是在我的场景各种别扭或者低效,不能很好地满足我的需求:其实需求很简单,我就需要解析ipv4的
2014-09-05 15:55:35
1598
原创 简单高效dns ipv4解析
【头文件】/// dns协议打包解包(ipv4地址)/// @file/// @date 2014-08-29 22:13:30/// @version 1.0.0/// @author ling-zhou(周龄), master@manpage.cn/// @copyright Tencent/// @namespace hydra#ifndef __DN
2014-08-30 19:49:15
3726
原创 选择合适的整数运算方法
【简单移位】大家都知道对于整数乘以2的幂可以通过位左移完成,整数除以2的幂可以通过位右移完成。实际上现在的编译很聪明,即使不显式地用移位的方式优化,编译器也会自动帮忙完成优化,不过前提是这个数是2的幂且是常量。 【整数除&求余】整数除法和求模往往成对的出现,如:quotient = dividend / divisor remainder = dividend
2014-08-21 22:40:11
1045
原创 写时拷贝惹得祸
【问题表现】hydra cgi底层库取出来的参数不对 【问题定位】1. 确认是否库的问题check out hydra-release_src-3.10.0,拷贝问题参数到单元测试用例,编译运行,表现跟上面贴图一致,确认是库本身的问题。遗憾的是,cgi底层库单元测试本身的用例全都通过。2. 走查源码仔细确认检查,cgi底层库依赖hydra_u
2014-08-20 11:24:09
613
原创 个人开发经验总结
个人心得,仅供参考一.提升规范性1. 保持规范整洁的目录结构,用不同的目录存储不同的模块。比如ugc目录存储ugc模块,activity目录存储活动平台模块。模块内部进一步细分share、接口、cgi、server等子目录。避免将不同模块的东西放到一起而显得凌乱。2. 与时俱进,文件编码尽量用utf8。3. 尽量避免使用全局using namespace
2014-08-20 11:20:55
820
原创 用strace跟踪系统调用
之前有新同事在问,strace的时候怎么样过滤掉某些系统调用, 这里简单总结下,希望对新同事有参考作用 部分跟踪举例:1. 只跟踪epoll_wait和gettimeofday,其他系统调用通通过滤掉,可以这样: strace -e trace=epoll_wait,gettimeofday(逗号分隔)2. 过滤epoll_wait和gettimeo
2014-08-20 11:15:59
1869
原创 tcp连接失败分析
前端时间业务团队在使用平台oidb中转服务的时候,偶尔出现connect失败的情况。这里简单总结下connect失败的可能原因,供参考。 一。网络不通由于iptables防火墙隔离等原因,导致两台机器之间无法连接。 二。网络波动偶尔出现的网络故障,导致两台机器之间连接失败。一般可以通过ping找到蛛丝马迹 三。client端分配不到“端口”可能的原因有2个:
2014-08-20 11:12:15
21443
1
原创 让c/c++代码更好的缩进
将以下内容追加到开发机自己用户的 ~/.vimrc文件中,可以让vi更好的对C/C++代码进行缩进。cinoptions是缩进相关的选项。具体的可以查看vim帮助IndentNamespace是用以防止namespace内部缩进的函数。如果不希望namespace内部内容缩进的话,就加上这个函数;否则不要加上这个函数(或者将setlocal indentexpr=Inden
2014-08-20 11:03:27
1404
原创 快速命令行编辑
可能很多人还在使用Backspace退格键一个字符一个字符进行删除,如果你还在用方向键一个字符一个字符的移动,那么下面的介绍会对你有所帮助。 一.Emacs模式(系统默认): Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按Ctrl+r,搜索上一条匹配的命令CtrL+p 查找上一个历史命令Ctrl+n
2014-08-20 11:02:00
538
原创 慎用string.resize()
string作为stl模块库的一部分,应用非常广泛,但是用的不好的话,会导致性能低下。可能很多人(包括我之前)认为resize操作仅仅只是改变string对象的内部偏移量,实际的情况是:除了改变内部偏移量之外,resize可能伴随内存重分配, 而且还会作填充操作,见帮助文档: 不适当使用resize可能会严重影响性能。见如下代码(修改自某底层库)
2014-08-20 10:59:35
5509
原创 gcc内建原子操作总结
gcc从4.1.2开始提供__sync_*系列的内建函数,用于提供加减和逻辑运算的原子操作。type是1,2,4或8字节长度的整形。后面的可扩展参数(...)用来指出哪些变量需要memory barrier,因为目前gcc实现的是full barrier(类似于linux kernel 中的mb(),表示这个操作之前的所有内存操作不会被重排序到这个操作之后),所以可以略掉这个参数。在3
2014-08-20 10:57:41
1471
原创 gcc实用扩展总结
一. 将语句跟声明放在表达式里面({ 语句、 声明 }) ,可以任意组合声明和语句,但是最后必须是一个语句,表示整个表达式的返回值比如: 二. 局部标签 __label__ end; for (int i = 0; i
2014-08-20 10:56:47
822
原创 警惕sscanf的使用
sscanf跟scanf类似,只不过sscanf是扫描字符串,而scanf是扫描标准输入,用得好的话会给解析带来极大的便利性,用的不好的话,可能导致程序陷入死循环,进而导致cpu 100%。 案例 可能不会像你预期的一样,得到一个三元组{1, 120, 6}, 而是让你得到无数个三元组: 原
2014-08-20 10:56:32
2465
原创 linux下如何printf size_t/uint64_t
一. linux下蛋疼的size_t/ssize_t 32位环境下size_t被定义为unsigned int, 64位环境下size_t被定义为unsigned long, 对于一个需要同时运行在32位、64位环境的程序来说,在printf或者LOG size_t的时候会比较纠结,一般采用如下第1、2两种方式:1. 强制类型转换统一转换成unsigned lo
2014-08-20 10:51:46
11653
1
原创 利用ctags提升看、写代码的效率
用vi有一段时间了。要方便的查看c、c++代码的话,还是要依赖一些工具、插件之类的东西,比如用ctags生成符号链接文件。用ctrl+]可以方便的跳转到符号的定义处。vi初学者可能只是简单的使用ctags,而没有使用ctags的一些有用的选项。不加选项使用ctags的话,只能生成一些最基本的符号链接信息。一.目前我使用的ctags的完整参数,供参考:alias ctags="cta
2014-08-20 10:51:12
876
原创 gcc初始化顺序问题
【问题】 最近在封装一个底层库的时候遇到诡异的问题,用gcc4.1.2编译的程序一切正常, 用gcc4.8.2编译的程序运行总是coredump。 经过分析后发现是初始化顺序问题,代码如下(经过简化): typedef std::map typeid_t; typeid_t TYPEID; __attrib
2014-08-20 10:35:17
2156
原创 好用的epoll接口封装
/// epoll接口封装/// @file/// @date 2012-02-14 15:21:53/// @version 1.0.0/// @author baozhou(周龄), master@manpage.cn/// @copyright Tencent/// @namespace hydra// Revision: $Id: epoller.h 1519
2014-07-16 10:15:17
882
原创 简单高效uri解析
header:/// @brief 解析形如[protocol://]domain[:port][path][?query_string]的url/// @param[in] url 被解析的url/// @param[out] protocol 解析到的形如 http/https/ftp/... 的协议串(没有默认为http)/// @param[out] domain 解析到的
2014-07-16 10:05:18
1146
原创 C/C++ 资源自动清理
【函数/语句块 级别的自动清理】方式一.借助类的析构原理class C{public: C(int* ptr): _ptr(ptr) { } virtual ~C() { delete[] _ptr; } private: int* _ptr;}; void func(){ C obj(new int[5])
2013-10-15 13:40:50
1289
原创 integer string极速互转 优化过程
【前言】在C/C++编码中有大量的string、interger互转需求,系统接口要么不好用,要么性能不高。基于性能优化、个人兴趣两个主要目的,对string、integer互转优化做了大量的尝试,下面分享一下优化中的一些过程。【优化效果概览】32位环境(-O2):[----------] 4 tests from performance
2013-10-15 13:35:16
1365
python expect工具
2014-01-21
Exploring Expect
2013-10-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人