tcmalloc导致coredump问题踩坑
自研serverless平台存在一个问题很多年了,引入cpython以后,就不能使用tcmalloc了
否则会直接coredump,这个问题不解决,使用平台的同学就没办法进行内存泄露分析
在一个多部门组成的python和C++的混合脚本上,问题爆发了,由于申请内存是一个部门的模块,释放内存又是另外一个部门的模块,跨部门协作下的内存排查太过困难了
因此还是需要从平台侧解决这个问题
自研serverless平台存在一个问题很多年了,引入cpython以后,就不能使用tcmalloc了
否则会直接coredump,这个问题不解决,使用平台的同学就没办法进行内存泄露分析
在一个多部门组成的python和C++的混合脚本上,问题爆发了,由于申请内存是一个部门的模块,释放内存又是另外一个部门的模块,跨部门协作下的内存排查太过困难了
因此还是需要从平台侧解决这个问题
本文的llvm版本,是基于llvm7.1.0的release包添加了一些利于理解的日志,没有改功能,已经上传到github:https://github.com/tedcy/llvm7_test
在conanio/gcc5:2.91的镜像版本,使用项目中的build.sh就能编译
RuntimeDyldImpl是RuntimeDyld的PIMPL模式,因此省略了RuntimeDyld
类图里面有让人眼花缭乱的MemMgr和Resolver传递,实际上都是指向的RTDyldMemoryManager
昨晚又整ssh配置整了半天,记不清楚是第几次踩坑了,还是需要整理一下问题的处理思路
我是在docker上操作的,首先在https://hub.docker.com/search?q=gcc5&type=image找到想要的镜像,然后拉镜像运行(https://github.com/dongyubin/DockerHub看下可用的代理)
1 | ~ docker pull proxy.vvvv.ee/conanio/gcc5 |
随后登陆安装ssh基础依赖
最近框架接json schema的需求,因此对其进行了调研
star最多的两个库https://github.com/pboettch/json-schema-validator和https://github.com/danielaparker/jsoncons(已完成)
| json-schema-validator | jsoncons | |
|---|---|---|
| 规范支持 | Draft 7 | Draft 7,Draft 2019-09,Draft 2020-12 |
| 字符串格式检查器 | 没有预设,都要自己实现 | 支持date,email,tcp等常见的数十种 |
| 外部依赖 | C++11起,依赖github.com/nlohmann/json |
C++20起 |
| 更新频率 | 253 commits,7 months ago | 12335 commits,yesterday |
总体而言,jsoncons会更好(规范支持全面,功能多,更新频率高),但是接入难度更高(依赖C++20,框架要兼容C++11的钉子户用户)
json-schema-validator基本功能都有,凑活够用,所以还是先接入json-schema-validator,对其进行源码分析
当前的一致性哈希存在四个bug,分别进行分析
以这个版本https://git.huya.com/server_arch/taf/-/blob/924950284557f183bd025ed758dc2e878ae36938/src/libservant/EndpointManager.cpp#L2448为例
我新增了部分日志,总体流程的关键代码在getConHashProxyForNormal
他的输入是hashCode(也就是prx->taf_consistent_hash(hashCode)传入的),输出是本次负载均衡选出的节点指针
1 | AdapterProxyPtr EndpointManager::getConHashProxyForNormal(int64_t hashCode) |
在Serverless平台的研发过程中,意外在python的import问题上踩坑了
大概还是对python的包管理基本原理不够了解,首先对python的包管理机制做一个总结,然后分析这一次踩坑的问题
Python 中 import 有四种常见语法形式:
本文整理一下遇到的编译问题,最常见的就是编译时缺符号,重定义
但是一般来说cmake生成的make语句会隐藏实际的gcc语句,如果手写的makefile,也有可能是目标规则没配置正确
查看实际的gcc语句
特殊命令
VERBOSE = 1或者V=1,主要看makefile怎么写的,一般都能用
通用的
make -n
实际上是只输出make试图运行的指令
查看目标规则情况
make -d
将打印 Make 为每个目标尝试的所有规则(包括内置规则)