连接相对于其他对象,创建成本较高,资源也有限。如果没有连接池,在高并发场景下,连接关闭又新建,很快就会因为过多的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足够强大。

阅读更多

Systemd 是 Linux 系统的一中 Init 用户程序和基础组件的集合,由 Lennart Poettering 带头开发并在 LGPL 2.1 及后续版本许可证下开源发布,目前 Systemd 已纳入众多 Linux 发行版的软件源中。

Linux 引导原理

Linux 内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于 /sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:

  1. 以 Ubuntu 为代表的 Linux 发行版采用 Upstart。
  2. 以7.0版本之前的 CentOS 为代表的 System V Init。
  3. CentOS7.0 版本的 Systemd。

阅读更多

systemd journal 之于 systemd 犹如 syslog 之于 init,其日志文件保存在 /var/log/journal 目录下。随着时间的流逝,该目录下会积累大量日志文件,占用不少的磁盘空间。如果硬盘容量较小或可用空间紧张,可以考虑清理过期日志释放占用的空间。

本文介绍清理systemd日志的方法。

阅读更多