Redis做内容缓存改善大集群性能问题

启动虚拟机前,需要选择运行节点,运行节点的选择主要是评估每个节点的内存和CPU使用,之前的PERL端是通过datareport向所有节点发送请求,走NFS通道,收集结果后打包回复PERL,大集群是48个节点,最开始尝试批量启动1000台虚拟机一天都没能启动完成。

评估每个节点的内存和CPU很必要,但是过中消耗时间太久,平均每台机器启动消耗2分钟,1000台需要33小时。

小打小闹优化效果并不明显,对比了几种优化手段,最后选择了使用Redis内存数据做缓存。

为什么选择Redis?

首先,不用引入新组件,因为我们的系统一直有它,但被忽视了很久。

其次,Redis的代码写的不错,短小精悍,运行稳定,效率非常高。
我测试从48个节点并发1600个链接不停读写主控的数据库,消耗资源为4.7% CPU, RSS内存消耗22MB,读写时间在毫秒级别:

继续阅读

Perl运行时调试工具

Perl这个语言没有现成的运行时调试工具,网上罗列的办法有:
1. strace只能看系统调用的函数,而且是perl解释器执行的流程。
2. gdb,只能调试perl解释器。
3. gdbperl,bulkdbg,没有用过。
4. perl-stacktrace,inspect-perl-proc两款在我们的虚拟化平台都没能正确运行。

13年的时候,写过一个运行时给Perl注入Enbugger库,使其能调试的脚本,为运行时调试而生。今天想查看某些阻塞进程究竟在做啥,于是加一个新技能,打印运行时的Perl脚本堆栈,是Perl脚本堆栈,不是Perl解释器堆栈。
注意:如果Perl处于阻塞状态,是无法interrupt的,例如下面进程处于等待锁状态,无法插入代码:

处于加锁等待,不返回无法注入代码。
继续阅读