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,监控、日志通...

erlang cowboy 在 nginx 499 时的 handler process shutdown

2022-10-23
阅读 3 分钟
1.5k
erlang 的 cowboy 是一个 web server 框架。它在客户端提前断开(nginx http code 499)时,会直接杀掉handler进程。这很容易造成bug。

谈谈erlang的nif

2022-10-23
阅读 2 分钟
1.9k
性能足够快,不希望有单点。鉴于有数据共享需求,没有单点的情况下,erlang中几乎只有ets了。因为ets仅能实现k,v查询,不能实现更复杂的读写需求,比如寻找某个子网(key="192.168.x.x")下的任意IP(values = ["192.168.1.1", "192.168.2.3"]),于是决定用NIF来实现。这是第一次尝试在实际业务中使用NIF。这里做一下总结。

erlang的vm层profiling工具

2022-02-26
阅读 9 分钟
1.5k
简介profiling工具是语言生态的重要组成部分。这篇blog对erlang的vm层profiling做一个总结。profiling tools overview可参考[链接]名字功能剩余性能)cprof统计模块的调用次数,可找出调用次数热点0.67eprof统计模块的调用次数和时间,可找出调用时间、次数热点0.17fprof统计模块调用次数和关系,可生成call-graph0.008e...

otp24 erlang Process aliases 引发的一个bug

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

erlang node_name phash 冲突坑

2021-08-28
阅读 6 分钟
2k
在线上遇到了因节点名哈希值冲突导致的部分机器无负载问题。10台机器中,冲突的机器达到了4台之多。假设哈希的概率是平均的。10台机器中,不存在冲突的概率接近

小心使用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.

从erlang otp21 升级 otp23 遇到的坑

2020-10-24
阅读 2 分钟
3k
最近将erlang从otp21.3.8.17升级至最新的otp23.1. 遇到了两个编译不告警, 但版本前后语义不一致, 且在changelist中未提及的问题. 在此做个记录.

使用fprof profile erlang

2020-07-31
阅读 2 分钟
2.3k
概述不谈profile tools的重要性. erlang profile一定要看看下面这篇.[链接]这篇blog记录一些实操.步骤fprof采集数据在程序中, 或者直接remote_console触发采集. {代码...} 不传递参数情况下, 默认会将fprof信息写入fprof.trace文件.使用kcachegrind 查看fprof的结果使用erlgrind转化为callgrind格式 {代码...} 安装kcach...

使用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...

一个erlang nif野指针的追踪过程

2019-11-19
阅读 12 分钟
3.6k
概述 最近半年, 经常出现一些奇怪的bug. CPU非常高, 但etop并没有red特别高的进程. 内存占用非常高, 和etop看到的内存不吻合. coredump. 因为erlang层面无法定位问题, 那问题只能在c了. BUG现场 cpu %100 ErtsRunQueue被写坏 {代码...} {代码...} AOFF_RBTree_t被写坏. rb_tree存在环. {代码...} {代码...} memory leak ...

一个很有意思的内存泄漏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/erlang内存泄漏排查.

2019-10-20
阅读 9 分钟
3.9k
对服务端程序来说, 内存泄漏是经常会面临的问题. 使用erlang的情况下, 不用程序员手动管理内存. 如果不写c driver, 一般的内存问题还是很容易定位的. 这篇blog对常见的内存泄漏类型, 排查手段做个小结.

谈谈erlang的timeout.

2019-10-01
阅读 2 分钟
3.1k
gen_server call timeout erlang的gen_server call默认有超时, 若在指定的超时内没有收到返回. 则会exit(timeout). gen_server call gen.erl:160 {代码...} 什么时候应该捕获timeout? 显然, 如果等待一段时间后, 没有收到消息, 有两种可能. 对端未能返回消息. 对端返回了消息. 但调用端尚未收到. catch timeout异常和处...

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回调.

erlang Cannot get connection id for node bug

2019-04-11
阅读 2 分钟
4.6k
bug 描述 ping 同样sname, 使用ip作为hostname, 会使vm崩溃. {代码...}

poolboy max_overflow 参数坑

2019-03-06
阅读 3 分钟
3.1k
某个服务节点在较低的qps(每秒2000次数据库访问)下, 在worker进程数100, max_overflow进程数100的情况下. 突然性能下降, 每秒只能处理1500次数据库访问. 导致请求处理延时从几MS上升至几百MS, 之后又逐渐恢复.

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