Linux

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 被填满了,网卡会直接丢弃后续的数据包,不做任何处理。
  • 减少内存拷贝 mmap, sendfile
  • 使用 eBPF 绕开协议栈的本机 I/O
  • 尽量少用 recvfrom 等进程阻塞的方式
  • 使用成熟的网络库
  • 使用 Kernel-ByPass 新技术
  • 配置充足的端口范围
  • 小心连接队列溢出
  • 减少握手重试 tcp_synack_retries
  • 如果请求频繁,启用短连接改用长连接
    • 节约握手开销
    • 规避队列满的问题
    • 端口数不一定出问题
  • TIME_WAIT 的优化
    • 开启端口 reuserecycle
  • 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!

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[Unit]
Description=iris service
After=network.target
StartLimitIntervalSec=0
StartLimitBurst=5
StartLimitIntervalSec=10

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/env /data/scripts/iris

[Install]
WantedBy=multi-user.target

零拷贝技术

UserSpace & KernelSpace

  • 用户空间 就是运行着用户编写的应用程序的虚拟内存空间
  • 内核空间 就是运行着操作系统代码的虚拟内存空间

在 32 位的操作系统中,每个进程都有 4GB 独立的虚拟内存空间,而 0 ~ 3GB 的虚拟内存空间就是用户空间 。

MMAP (Memory Map)

传统的文件读写

  1. 把文件内容读取到内存中
  2. 修改内存中的内容
  3. 把内存中的数据写入到文件中

.

Sendfile

.

使用 MMAP 读写文件

如果可以直接在用户空间读取 页缓存,就可以免去将 页缓存 数据复制到用户空间缓冲区的过程。

使用 mmap 系统调用可以将用户空间的虚拟内存地址与文件进行映射(绑定),对映射后的虚拟内存地址进行读写操作就如同对文件进行读写操作一样。

Linux 内核并不会主动把 mmap 映射的 页缓存 同步到磁盘,而是需要用户主动触发。同步 mmap 映射的内存到磁盘有 4 个时机:

  • 调用 msync 函数主动进行数据同步(主动)。
  • 调用 munmap 函数对文件进行解除映射关系时(主动)。
  • 进程退出时(被动)。
  • 系统关机时(被动)。

Linux File Descriptor

.

Debug Performance

.

Useful Tricks

check crontab logs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1, check /var/log/syslog
cat /var/log/syslog | grep -w 'cron'

# 2. use a custom log file
touch /var/log/cron.log
vim /etc/rsyslog.d/50-default.conf
> cron.*   /var/log/cron.log
systemctl restart rsyslog

# 3. use dedicated services like cronitor

sar to check system resource stats

1
2
3
4
5
6
sudo apt install sysstat

systemctl start sysstat.service

# check cpu resource (3 tims at an interval of 7s)
sar -u 7 3

References

Licensed under CC BY-NC-SA 4.0
Get Things Done
Built with Hugo
Theme Stack designed by Jimmy