-
TCP backlog:
Linux内核2.2之后,分离为两个backlog来分别限制半连接(SYN_RCVD状态)队列大小和全连接(ESTABLISHED状态)
队列大小; SYN queue 队列长度由 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,默认为2048。
listen()函数里传递的backlog并不是直接使用,而是取的min(backlog, somaxconn)somaxconn的值,默认为128
https://www.jianshu.com/p/7fde92785056 -
系统调用和库函数调用:
- 函数库调用
在所有的ANSI C编译器版本中,C库函数是相同的 各个操作系统的系统调用是不同的
它调用函数库中的一段程序(或函数)
与用户程序相联系
在用户地址空间执行
它的运行时间属于“用户时间”
属于过程调用,调用开销较小
在C函数库libc中有大约300个函数
典型的C函数库调用:system fprintf malloc - 系统调用
各个操作系统的系统调用是不同的;
它调用系统内核的服务,是操作系统的一个入口点,在内核地址空间执行;
它的运行时间属于“系统”时间;
需要在用户空间和内核上下文环境间切换,开销较大;
在UNIX中大约有90个系统调用,
典型的系统调用:chdir fork write brk;
- 函数库调用
-
syn-cookie
-
信号递送
信号递送给进程的过程 参考 -
关于Linux MMU
vmalloc() 大块内存,物理地址不连续;
kmalloc()小内存,物理地址连续 -
exit()与_exit()区别,fork() printf()
-
tcp的一些默认时间(linux)
connect timeout 75s tcp_syn_retries=5 内核有限制最大值
syn-recv timeout 75s tcp_synack_retries
keepalive 间隔2hour try 11min -
线程/协程的切换
协程允许我们写同步代码的逻辑,却做着异步的事,避免了回调嵌套,使得代码逻辑清晰。
libco是用glibc 的 ucontext来实现协程切换。
进程调度,切换进程上下文,包括分配的内存,包括数据段,附加段,堆栈段,代码段,以及一些表格。
线程调度,切换线程上下文,主要切换堆栈,以及各寄存器,因为同一个进程里的线程除了堆栈不同。
协程又称为轻量级线程,每个协程都自带了一个栈,可以认为一个协程就是一个函数和这个存放这个函数运行时数据的栈,这个栈非常小,一般只有几十kb -
go slice的扩容
如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。
一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。
注意:扩容扩大的容量都是针对原来的容量而言的,而不是针对原来数组的长度而言的; 别外如果对数组append后长度未超过cap则不需扩容,就会在原来基础上增加值,会影响到原slice或原数组的值。
arr := [5]int{1, 2, 3, 4, 5} // 数组len=5 cap=5
slice := arr[1:2] // 切片len=1 cap=4
// 对slice的修改会影响arr,slice的cap受限于cap(arr)
slice = append(slice, 5) // 追加时如果cap未达上限,则不扩展,进而影响arr
slice[0] += 10 -
ping各server响应RTT
同一lan 小于1ms 大多0.2左右
美国 大于100ms 大多200ms
同城同线 10ms ~ 20ms
比如广州-深圳电信23ms 广州-苏州32ms
不同线一般大于100ms
跨城同线50ms -
绑定进程/线程到CPU上
API:
sched_setaffinity sched_getaffinity
pthread_setaffinity_np pthread_getaffinity_np
CMD:
taskset -cp 0 -
拜占庭将军问题
一致性问题,n ≥ 3t+1; 即叛徒的数量不能超过3分之1才能确保一致性;