erlang on_load_function_failed 的排查

2023-12-14
阅读 2 分钟
224
概述在做mongo建连优化时,突然发现打出的包无法启动。有日志如下: {代码...} 原因是打包机的环境变更,导致: {代码...} 排查过程回滚代码到可启动包代码。重新打包,也无法启动。基本判定是打包机环境变更问题。并找了打包机的管理同学。设可运行包为a,不可运行包为b,对比a, b的差异。a, b包均可在开发环境正常运行...

elixir redis driver 选型

2023-10-07
阅读 2 分钟
282
调研从redis官网推荐、hex.pm下载中可以看到。有 redix/eredis 供选择。redix vs eredisredix 在如下方面有明显的优势:redix支持链接多路复用。而eredis是poolboy,一个链接同一时间只能阻塞执行一条指令。支持child_spec,后台静默重连,用gen_statem处理重连期间的请求,大部分时候重连无感。telemetry,监控、日志通...

otp24 erlang Process aliases 引发的一个bug

2022-02-12
阅读 4 分钟
1.5k
最近升级了otp24,一个提供位置无关call entity的组件在调用的entity进程退出时。会出现timeout。在追查后发现和erlang otp24的一个改进相关。[链接]

小心使用erlang的monitor

2020-12-12
阅读 2 分钟
2k
要从一次线上的内存泄漏说起. 最终定位到在异步send方法中, monitor了被调用进程, 而又没有释放, 导致泄漏. 违反直觉的是, 这个泄漏是双向的, A monitor B后, A会记录 monitors B, B会记录 monitored_by A. 进程A退出后, 进程B不会释放 monitored_by A. 所以, 在使用monitor时, 注意在任何情况下, 都要demonitor.

使用mnesia在节点间共享内存

2020-07-04
阅读 7 分钟
2.2k
有很多场景需要在一系列节点间共享内存数据. 如, 有一系列水平对等的网关, 可以在任意网关节点上拿到所有网关的特定内存信息. 一般的做法是使用zookeeper, etcd等提供了分布式一致性保证的服务. 使用zookeeper, etcd做节点间的数据同步当然没有问题. 但是:

erlang httpc request timeout 问题.

2020-07-04
阅读 5 分钟
3k
概述线上发现http client偶有非常长的超时. 于是深挖一下erlang httpc 的超时.httpc request 耗时一个http请求耗时包含如下部分创建链接(若没有可用的链接)发送/等待返回在erlang httpc中由如下两个参数控制:timeoutTime-out time for the request.The clock starts ticking when the request is sent.Time is in millis...

一个很有意思的内存泄漏bug.

2019-10-20
阅读 8 分钟
2.9k
bug回顾 bug_fix 时间线 x月x日 10:00 x_service 内存开始快速上涨 x月x日 10:18 用户报告x_service内存飞速上涨. x月x日 10:20 平台mongodb因内存不足重启 x月x日 10:22 重启x_service x月x日 11:00 x_service内存再次快速上涨 x月x日 14:45 回滚x_service并再次更新, x_service服务恢复正常. x月x日 19:48 定位到是Enu...

elixir基准测试记录

2019-07-29
阅读 5 分钟
1.8k
elixir基准测试 代码见elixir_basic_benchmark 测试变量 {代码...} 总表 操作 耗时 10 members lists ++ 100 members lists 0.02μs 100w process dict get/put/delete 0.03μs map get 0.03μs map put/delete 0.05μs 100w ets set/bag/duplicate_bag read 0.1μs 100 members lists ++ 10 members lists 0.02μs 100w ets o...

when erlang gen-server's terminate is call

2019-06-25
阅读 3 分钟
2.2k
GenServer的terminate callback在进程退出时会被调用. 但若没有:erlang.process_flag(:trap_exit, true), 进程可能被悄无声息地kill掉, 而不走terminate回调.

拆分umbrella project遇到的deps编译env为prod问题

2019-05-07
阅读 2 分钟
1.4k
此前代码放在一个repo下, 代码重用的方式是umbrella. 为了将代码拆分, 让服务间的边界更明显, 我们将elixir project拆分开, 以deps方式重用代码. 遇到了deps编译时默认env为prod问题.

docker swarm mode 下容器重启IP改变引发的 CLOSE_WAIT 问题

2019-02-22
阅读 2 分钟
4.3k
如下图. server docker restart后, client端写入的日志丢失, 并且无报错.因为不支持时序图, 把时序图代码嵌入在代码里.

inside gen_server call

2019-01-12
阅读 10 分钟
2.3k
前段时间的两个工作.一个是entity集群库, 可以通过entity_id调用任意节点上的entity. 一个是名字服务, 可以为一系列pid注册名字, 并可以以这些名字调用对应的pid.都会遇到同一些问题: 当我们使用GenServer.call/2时, 发生了什么, 会有什么异常情况发生? 哪些异常应该捕获? 以什么样的方式处理这些异常/错误?当call的pid...

gen_tcp参数总结

2019-01-12
阅读 7 分钟
3.8k
在用elixir 写 rpc server/client时, 需要对传入gen_tcp的参数做一些考量. 如, 部分参数应该允许用户修改, 比如sndbuf recbuf, 让用户根据使用场景调节, 部分参数应该屏蔽, 减少使用理解成本.故, 深挖了一下gen_tcp的option