Go语言中实现基于 event-loop 网络处理

我们知道, Go语言为并发编程提供了简洁的编程方式, 你可以以"同步"的编程风格来并发执行代码, 比如使用go关键字新开一个goroutine。 对于网络编程,Go标准库和运行时内部采用 epoll/kqueue/IoCompletionPort来实现基于 event-loop的网络异步处理,但是通过netpoll的方式对外提供同步的访问。具体代码可以参考 runtime/netpollnetinternal/poll

Package poll supports non-blocking I/O on file descriptors with polling.
This supports I/O operations that block only a goroutine, not a thread.
This is used by the net and os packages.
It uses a poller built into the runtime, with support from the
runtime scheduler.

当然,我们平常不会设计到这些封装的细节,正常使用net包就很方便的开发网络程序了, 但是,如果我们想自己实现基于epollevent-loop网络程序呢?

阅读全文

[译]Go TCP Socket的实现

原文: TCP Socket Implementation On Golang by Gian Giovani.

译者注: 作者并没有从源代码级别去分析Go socket的实现,而是利用strace工具来反推Go Socket的行为。这一方法可以扩展我们分析代码的手段。
源代码级别的分析可以看其实现: net poll,以及一些分析文章:The Go netpoller, The Go netpoller and timeout

Go语言是我写web程序的首选, 它隐藏了很多细节,但仍然不失灵活性。最新我用strace工具分析了一下一个http程序,纯属手贱但还是发现了一些有趣的事情。

下面是strace的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
91.24 0.397615 336 1185 29 futex
4.13 0.018009 3 7115 clock_gettime
2.92 0.012735 19 654 epoll_wait
1.31 0.005701 6 911 write
0.20 0.000878 3 335 epoll_ctl
0.12 0.000525 1 915 457 read
0.02 0.000106 2 59 select
0.01 0.000059 0 170 close
0.01 0.000053 0 791 setsockopt
0.01 0.000035 0 158 getpeername
0.01 0.000034 0 170 socket
0.01 0.000029 0 160 getsockname
0.01 0.000026 0 159 getsockopt
0.00 0.000000 0 7 sched_yield
0.00 0.000000 0 166 166 connect
0.00 0.000000 0 3 1 accept4
------ ----------- ----------- --------- --------- ----------------
100.00 0.435805 12958 653 total

阅读全文

Go 1.10 的pprof的工具将直接支持火焰图

google/pprof是一个性能可视化和分析工具,由Google的工程师开发。虽然自称不是Google官方的工具,但是项目挂在google的team下,而且还在Google其它项目中得到应用,是非常好的一个性能剖析工具。

go tool pprof 复制了一份google/pprof的代码, 封装了一个golang的工具,用来分析Go pprof包产生的剖析数据,也就是最终数据的处理和分析还是通过gogole/pprof来实现的。

这样,你至少就用两种方式来分析Go程序的 pprof数据:

  1. go tool pprof : Go封装的pprof的工具
  2. pprof: 原始的pprof工具

阅读全文

GOMAXPROCS需要设置吗?

自 Go 1.5开始, Go的GOMAXPROCS默认值已经设置为 CPU的核数, 这允许我们的Go程序充分使用机器的每一个CPU,最大程度的提高我们程序的并发性能, 而且,在大部分情况下, 我们并不会去设置这个参数。因为默认值已经足够好了, 以至于fasthttp的作者valyala提议禁止runtime.GOMAXPROCS设置这个数值, 对于所有的case, GOMAXPROCS默认值是否是最好的值呢?

badger的作者Manish Rai Jain就遇到了这样一个问题

阅读全文

使用 Go 和 Let's Encrypt 快速配置HTTPS加密

Let's Encrypt 在2015年秋季推出了免费的数字证书认证计划,旨在消除当前手动创建和安装证书的复杂性,并推广加密的万维网服务,为安全网站提供免费的SSL/TLS证书。
Let's Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。

用以实现这一新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。提案的一个版本已作为一个Internet草案发布。

目前, 申请证书的域名只能是特定的域名, 不支持通配符证书(*.example.com),这对于一个拥有众多子域名的公司来说很不方便。但是今年已经说了,将于2018年1月支持通配符证书和ACME v2 API。

阅读全文

[译]使用 bcc/BPF 分析 go 程序

BCC 是基于 BPF 的 Linux IO 分析、监控、网络工具集合。BPF Compiler Collection (BCC) 是创建高效内核追踪和处理程序的工具包,包含几个有用的工具和用例。BCC 扩展了 BPF (Berkeley Packet Filters) 的用途,BPF 之前被称为 eBPF,是 Linux 3.15 新增的一个新特性。BCC 大部分的功能都要求 Linux 4.1+。

本文翻译自性能分析大牛Brendan Gregg的 2017年中旬的一篇文章: Golang bcc/BPF Function Tracing, 介绍如何使用最新的工具更加深入的分析Go程序。

阅读全文

Go Plugin的一个bug

Go 1.8中增加了 plugin package,但是仅支持Linux操作系统,并且还有一些已知的bug。可以说,这个插件系统的实现还未达到"产品级"的水平。

The plugin support is currently incomplete, only supports Linux, and has known bugs.

一些已知的bug已经推到 Go1.10甚至以后的版本中修复了。

今天在测试Go 1.9中的功能的时候就遇到了plugin的一个bug。

阅读全文