TL; DR:本文主要从 socket 的关闭方式谈到 socket 的 SO_LINGER 属性,进一步分析 nginx 关于 lingering 的配置和源码,浅谈如何避免 socket 关闭时可能出现的一些问题。

socket 的关闭

在 Unix 上,一个连接实际上对应的是内核里的一个 fd, sockfd = socket(int socket_family, int socket_type, int protocol) ,因此 socket 的关闭实际上是使用 close() 调用将其当作一个普通 fd 进行关闭;但是对于 TCP 连接,可以使用 shutdown() 系统调用,将其当作一个全双工连接进行关闭后再使用 close() 进行销毁,两种方式在行为上略有区别。

在一个 socketfd 被 close() 调用时,主动关闭端内核会首先检查 read buffer 中有没有未被应用层程序处理的内容, 如果有,则此时内核会丢弃这段 buffer 并直接向对端发送 RST 并关闭 socket,这将导致之前已经发送但尚未送达的、或是已经进入对端 receive buffer 但还未被对端应用程序处理的正常响应数据将[……]

Read more

nf_conntrack 的数据结构和相关参数调优

首先需要明确的是,nf_conntrack 模块并不是所有 Linux 内核都会加载,最常见的导致加载该模块的原因是使用了 iptables、lvs 等内核态 NAT/防火墙导致内核需要对连接表进行追踪,iptable_nat、ip_vs 等多个内核模块都依赖 nf_conntrack, 但是 nf_conntrack 的存在会影响高并发下的内核收包性能。

在内核中,连接跟踪表是一个二维数组结构的哈希表(hash table),哈希表的大小记作 HASHSIZE,哈希表的每一项(hash table entry)称作bucket,因此哈希表中有 HASHSIZE个bucket存在,每个bucket包含一个链表(linked list),每个链表能够存放若干个conntrack条目( bucket size)。对于一个新收到的数据包,内核使用如下步骤判断其是否属于一个已有连接:

  • 内核提取此数据包信息(源目IP,port,协议号)进[……]

    Read more

TL;DR: Windows 10 LTSB 1607 升级到 LTSC 1809 之前,需使用 dism 彻底关闭 developer mode 并删除相关软件包,不要问我为什么手贱开了 dev mode。

前情提要:Windows 10 1809 由于各种 bug 经历了多次撤回,终于发了一个能用的版本,为了 WSL 我决定把我一万年没升级的 LTSB 2016 升级一下,然而巨硬的 Windows 10 upgrade 工具(中文版叫易升)不适用于 LTS,因此升级比较蛋疼,ISO 解压之后直接 setup.exe,此前(约11月初)用这个方式升级会显示错误并给出一个 URL,当时的镜像名为 cn_windows_10_enterprise_ltsc_2019_x64_dvd_2efc9ac2.iso(SHA1: E04252542AEB494464AD9231F4F2E2C021EAB2EC)过了一个月听闻 LTS 重新发了镜像,于是再试一试升级,升级前后使用的镜像分别是:

然后看着屏幕转了半个小时菊花:

怒吃一个滚回原来的系统,错误代码[……]

Read more

Index

  • 什么是 homelab,为什么建设 homelab
  • 平台和 CPU 的选型
  • 服务器的选型和购买
  • 带外管理和风扇控制
  • 外部访问和内网基础服务

什么是 Homelab & 为什么建设 Homelab

Homelab [hom-læb](n): a laboratory of (usually slightly outdated) awesome in the domicile

可能很多人不知道 homelab 是什么,甚至知道这个东西是什么之后也不理解为什么要折腾这种东西,没关系,毕竟人与人终究是不能相互理解的。

根本上说,家用服务器是为了解决普通台式机和笔记本不容易解决的需求(比如说大内存和较多的硬盘位),或者是可以以远低于普通台式机的成本达到一些目的(DDR3内存和部分服务器 CPU 洋垃圾价格低廉),由于这些特点,homelab 常见于以下需求:

  • 存储: BT 下载、远程备份
  • 多媒体:串流、电影/音乐管理和在线播放
  • 游戏:MC、CSGO 私服,网游挂机等
  • 网站:这[……]

    Read more

TL;DR

本文主要讨论了 bash 数组和利用 Shell Expansion 语法对数组进行操作,由于写了一个很蛋疼的 bash 工具故想把 bash 坑爹的数组语法吐槽一下。

bash 的语法确实反人类,如果有选择余地,尽量不要用 bash 实现超过10行的功能,即使用 Python 写一万个 subprocess 也好过和 bash 的奇妙语法斗智斗勇。

bash 数组基本语法

虽然 bash 没有真正的变量和引用,但是他真的有数组(也许很多人并不知道 bash 其实是有数组的?)

本质上 bash 中的变量都可以认为是字符串而不存在数值类型变量,数值计算实际上也是通过一种展开 Arithmetic Expansion 实现,“变量引用”概念实际上是一层 getter

可以显示的声明一个变量为数组类型(不声明也可以直接按数组类型赋值): declare -a array

数组赋值 array=(1 2 3 4)

bash 数组支持稀疏赋值,即只给指定序号的元素赋值:[crayon-5d[……]

Read more