目标

每当有新的 git tag 推送到 GitHub 时执行对应工作流; 工作流中构建 Docker 镜像并推送到 Docker Hub

Github Actions 介绍

Automate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you’d like, including CI/CD, and combine actions in a completely customized workflow.

通过 GitHub Actions 自动化执行自定义软件开发工作流. 可以在 Github Actions 市场 发现, 创建及共享任何你喜欢的Job.

阅读更多

什么是CPU上下文

Linux是一个多任务操作系统,它支持远大于CPU核心数的任务同时进行。当然,这些任务并不是真的同时在运行,而是因为系统在很短的时间内,将CPU轮流分配给它们,造成多任务同时运行的错觉。每个任务在运行前,CPU都需要知道任务从哪来加载,又从哪里开始运行,也就是说,需要事先帮它们设置好CPU寄存器和程序计数器( Program Counter,PC )。

CPU寄存器:是CPU内置的容量小、但速度快的内存,用来临时存放指令执行运行过程中的操作数和中间(最终)的操作结果。

程序计数器:是用来存储CPU正在运行的指令位置、或者即将执行的下一条指令位置。

CPU寄存器和程序计数器是CPU运行任何任务前,必须依赖的环境,也被称作CPU上下文。

阅读更多

Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。

1
$ git commit -m "hello world"

上面代码的-m参数,就是用来指定 commit mesage 的。

如果一行不够,可以只执行git commit,就会跳出文本编辑器,让你写多行。

1
$ git commit

阅读更多

连接相对于其他对象,创建成本较高,资源也有限。如果没有连接池,在高并发场景下,连接关闭又新建,很快就会因为过多的TIME_WAIT(连接主动关闭方)导致无法创建更多连接了,程序被压死。

net/http 连接池参数

Go (测试版本 go 1.14)的net/http包是有连接池功能的,具体地,是 Transport 用于连接池化。

Transport is an implementation of RoundTripper that supports HTTP, HTTPS, and HTTP proxies (for either HTTP or HTTPS with CONNECT).

By default, Transport caches connections for future re-use.

阅读更多

在 UDP 上使用 connect 的情况:

  1. 需要获取 ICMP 的错误信息
  2. 如果需要向同一个IP地址多次 sendto ,用以减少不断的连接、断开,提高性能

阅读更多

本文整理在 K8S 环境中的网络性能调优实践。一些涉及到内核参数的调整,关于如何调整 Pod 内核参数的方法请参考 为 Pod 设置内核参数

高并发场景

TIME_WAIT 连接复用

如果短连接并发量较高,它所在 netnsTIME_WAIT 状态的连接就比较多,而 TIME_WAIT 连接默认要等 2MSL 时长才释放,长时间占用源端口,当这种状态连接数量累积到超过一定量之后可能会导致无法新建连接。

阅读更多

平时写 http server 会接触到传输文件的问题。最简单的版本大概是这样子的:

1
2
3
4
5
6
7
8
for {
n, _ := file.Read(buf)
if n > 0 {
w.Write(buf[:n])
} else {
break
}
}

阅读更多

BBR (Bottleneck Bandwidth and Round-trip propagation time)是 Google 在 2016 年发布的一套拥塞控制算法。它尤其适合在存在一定丢包率的弱网环境下使用,在这类环境下,BBR 的性能远超 CUBIC 等传统的拥塞控制算法。

以下是 Google 公开的的一些资料

阅读更多

内核版本3.10.14为例

绑定源IP时,bind操作

af_inet.cinet_bind 函数

1
2
3
4
5
6
7
8
9
int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
{
struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
struct sock *sk = sock->sk;
struct inet_sock *inet = inet_sk(sk);
......
inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr;
......
}

阅读更多

前言

平常都是通过网页在线查询和阅读 Linux源码 ,这个网站bootlin是一家提供在线查找阅读linux大部分内核源码的社区,支持查看不同的内核版本,特别方便。但是毕竟是网页版,每次跳转或者查看函数引用都要刷新页面,流畅度取决于使用者的网速,总归体验是不如在本地通过IDE查看的。所以才有了这篇操作手册式的文章,一是通过VSCode来流畅地查看linux源码,二是熟悉下搭建的流程。像Linux这种顶级而庞大的项目代码,本来以为会很麻烦,然而却非常地简单,毕竟VSCode足够强大。

阅读更多