Linux is a family of open-source Unix-like operating systems based on the Linux kernel.
Registers
IPC
Process
fork
可以将 fork()
认作对父进程的程序段、数据段、堆段以及栈段创建拷贝。
Thread
pthread
(posix)
FS
Network
优化建议
- 减少不必要的网络 I/O
- 合并网络请求 (redis->multiGet)
- 调用者与被调用者的机器尽可能部署得近一些
- 内网调用不要使用外网域名
- 外网接口慢
- 带宽成本高
- NAT 单点瓶颈
- 调整网卡 RingBuffer 大小
- 在 Linux 的整个网络栈中,RingBuffer 充当了一个任务收发中转站的角色。对于接收过程,网卡负责往 RingBuffer 写入收到的数据帧,
ksoftirqd
内核线程负责从中取走处理。如果 RingBuffer 被填满了,网卡会直接丢弃后续的数据包,不做任何处理。
- 在 Linux 的整个网络栈中,RingBuffer 充当了一个任务收发中转站的角色。对于接收过程,网卡负责往 RingBuffer 写入收到的数据帧,
- 减少内存拷贝
mmap
,sendfile
- 使用 eBPF 绕开协议栈的本机 I/O
- 尽量少用
recvfrom
等进程阻塞的方式 - 使用成熟的网络库
- 使用
Kernel-ByPass
新技术 - 配置充足的端口范围
- 小心连接队列溢出
- 减少握手重试
tcp_synack_retries
- 如果请求频繁,启用短连接改用长连接
- 节约握手开销
- 规避队列满的问题
- 端口数不一定出问题
TIME_WAIT
的优化- 开启端口
reuse
和recycle
- 开启端口
- Scheduler
- Resource sharing is the key factor
- Time Accounting
- The fundamental rule in the
Completely Fair Scheduler
is: the task that ran less, will run next!
- The fundamental rule in the
PING
127.0.0.1
是回环地址。localhost
是域名,但默认等于127.0.0.1
。ping
回环地址和ping
本机地址,是一样的,走的是lo0 “假网卡”,都会经过网络层和数据链路层等逻辑,最后在快要出网卡前狠狠拐了个弯, 将数据插入到一个链表后就软中断通知 ksoftirqd 来进行收数据的逻辑,压根就不出网络。所以断网了也能ping
通回环地址。- 如果服务器
listen
的是0.0.0.0
,那么此时用127.0.0.1
和本机地址都可以访问到服务。
Linux Service Example
etc/systemd/system/iris.service
|
|
零拷贝技术
UserSpace & KernelSpace
用户空间
就是运行着用户编写的应用程序的虚拟内存空间内核空间
就是运行着操作系统代码的虚拟内存空间
在 32 位的操作系统中,每个进程都有 4GB 独立的虚拟内存空间,而 0 ~ 3GB 的虚拟内存空间就是用户空间 。
MMAP (Memory Map)
传统的文件读写
- 把文件内容读取到内存中
- 修改内存中的内容
- 把内存中的数据写入到文件中
Sendfile
使用 MMAP 读写文件
如果可以直接在用户空间读取 页缓存
,就可以免去将 页缓存
数据复制到用户空间缓冲区的过程。
使用 mmap
系统调用可以将用户空间的虚拟内存地址与文件进行映射(绑定),对映射后的虚拟内存地址进行读写操作就如同对文件进行读写操作一样。
Linux 内核并不会主动把 mmap
映射的 页缓存
同步到磁盘,而是需要用户主动触发。同步 mmap
映射的内存到磁盘有 4 个时机:
- 调用
msync
函数主动进行数据同步(主动)。 - 调用
munmap
函数对文件进行解除映射关系时(主动)。 - 进程退出时(被动)。
- 系统关机时(被动)。
Linux File Descriptor
Debug Performance
Useful Tricks
check crontab logs
|
|
sar to check system resource stats
|
|