摘要:如何使用 perf 分析 splice 中 pipe 的容量变化 这个文章为了填上一篇文章的坑的,跟踪内核函数本来是准备使用 ebpf 的,但是涉及到了低内核版本,只能使用 kprobe 了。 恰好,在搜索东西的时候又看到了 perf,可以使用 perf probe 来完成对内核函数的跟踪,使用相对
阅读全文
摘要:记一次 splice 导致 Go io.Copy 阻塞的排查过程 简而言之,net.TCPConn 的 ReadFrom 零拷贝实现 splice 在 1.21.0 - 1.21.4 删除了 SPLICE_F_NONBLOCK 参数,导致在 CentOS7.9(内核版本 3.10.0.0) 上 sp
阅读全文
摘要:使用 cmux 或 smux 对 TCP 连接进行复用 只写一下如何使用,不对实现进行大量描述,两个库的代码都比较精炼,花一会看一下就行。 cmux 对端口进行复用,单端口可以建立不同协议的连接(本质都是 TCP),如 TCP/TLS/HTTP/gRPC 或自定义协议 smux 对TCP连接复用,单
阅读全文
摘要:如何在 libevent 中读取超过 4096 字节的数据 bufferevent 是 libevent 中相对高层的封装,较 event 使用起来方便很多。 之前有一个需求,需要从服务端读取数据进行操作,为了防止数据过大,在 bufferevent 的 read_callback 中循环调用 bu
阅读全文
摘要:如何基于 spdlog 在编译期提供类 logrus 的日志接口 实现见 Github,代码简单,只有一个头文件。 前提 几年前看到戈君在知乎上的一篇文章,关于打印日志的一些经验总结; 实践下来很受用,在 golang 里结构化日志和 logrus 非常契合,最常见的使用方式如下。 logrus.W
阅读全文