先来看一个 demo:
1 package main
2
3 import (
4 "fmt"
5 "net"
6 "os"
7 "runtime"
8 )
9
10 var rawFileList []*os.File
11
12 func main() {
13 l, err := net.Listen("tcp"
1.14 defer
正常处理流程
在 Go 1.14 中,增加了一种新的 defer 实现:open coded defer。当函数内 defer 不超过 8 个时,则会使用这种实现。
形如下面这样的代码:
defer f1(a)
if cond {
defer f2(b)
}
body...
会被翻译为:
deferBits
内网使用服务发现后,服务与其它服务的实例之间使用一条 TCP 长连接进行通信。这种情况下常见的做法是按照 registry 下发的 host:port
列表来直接建连。
简单来说就是下图这样:
每一个服务实例都需要和它依赖的服务的每一个实例都把连接给建上。如果各个服务的规模不大,这样没什么问题。
互联网公司的核心服务规模都比较大,几千/万台机器(或几千/万个实例)的单一服务并不少见,这时候 client 要和所有 server 实例建连,会导致
client 端的 conn pool 里有大量连接,当然,server
本文内容是 2013 年 Google 对 packetdrill 的论文翻译。
网络协议测试很麻烦,线上的网络问题往往都是偶发的,难以捕捉。
packetdrill 是一个跨平台的脚本工具,可以用来测试整个 TCP/UDP/IP 网络栈实现的正确性和性能,从系统调用一直到硬件网络接口,从 IPv4 到
IPv6。
该工具对 Google 工程师研发 Linux TCP 中的 Early Retransmit,Fast Open,Loss
之前在这篇 无人值守(一) [http://xargin.com/autodumper-for-go/]
简单介绍了我们针对线上抖动问题定位的工具的设计思路,思路很简单,技术含量很低,是个人都可以想得到,但是它确实帮我们查到了很多很难定位的问题。
在本篇里,我们重点讲一讲这个工具在生产环境帮我们发现了哪些问题。
OOM 类问题
RPC decode 未做防御性编程,导致 OOM
应用侧的编解码可能是非官方实现(如 node 之类的无官方 SDK 的项目),在一些私有协议 decode 工程中会读诸如 list len
之类的字段,