ceilometer 性能分析 II
发布网友
发布时间:2024-10-07 18:35
我来回答
共1个回答
热心网友
时间:2024-11-03 21:45
在深入研究ceilometer性能优化的探索中,我们关注了ceilometer通知服务的CPU使用情况。在优化了导致大量get_endpoints请求的问题后,我们发现仍有优化空间。在火焰图中,re.py模块的调用占用了总CPU使用的大约28%,这引起了我们的注意。经过代码分析,我们发现对每个metric执行一次fnmatch命令导致了大量请求,从而影响性能。进一步追踪到oslo_util的fnmatch实现,我们注意到在CentOS自带的Python 2.7.5环境下使用的是该实现。问题在于2.7.9以下版本的fnmatch实现存在线程不安全问题,而使用系统的版本在该版本上能避免这个问题。
深入分析代码,我们发现fnmatch的实现依赖于re模块,并且为了提升re.compile性能,引入了一个大小为100的全局_Match_CACHE字典。然而,当该字典满载后,它被完全清空。这种做法导致了所有正则表达式的重新编译,特别是在ceilometer处理大量metric时,这种情况频繁发生,从而引起大量的CPU消耗。通过验证,我们发现在不同大小的CACHE设置下,这种行为会导致性能显著下降。
通过编写测试代码验证这一问题,我们观察到当CACHE大小从100增加到101时,运行时间从0.116秒增加到3.24秒,单次循环时间从1.16毫秒增加到31.4毫秒,性能下降了27倍之多。这揭示了CACHE管理问题对性能的严重影响。
针对这一问题,我们发现社区已经为解决这个问题提供了解决方案,特别是在OpenStack Pike版本中。通过搜索最新的代码,我们发现社区已经采取了措施,使用了不同的实现,包括使用functools.lru_cache机制,以及改进的cache管理策略,避免了完全清空CACHE的情况。Python3的实现相较于Python2,性能有了显著提升。
通过应用社区提供的解决逻辑,我们对代码进行了backport,并观察了优化效果。优化后,火焰图中的CPU消耗显著降低,从100%降至10%-20%的区间,性能得到了显著改善。对比优化前后的火焰图,我们可以看到大量的优化工作已经完成,CPU消耗减少了近50%以上。
总结而言,ceilometer性能优化的关键在于解决fnmatch实现中的线程安全问题以及改进CACHE管理策略,以避免不必要的正则表达式重新编译,从而显著降低CPU消耗。通过社区贡献的解决方案,我们成功地提升了ceilometer的性能,为优化开源项目提供了实践案例。