From a205522e22bf00bb81ea72aecf7fa78a2e5093c3 Mon Sep 17 00:00:00 2001 From: liruyu Date: Thu, 2 Dec 2021 10:00:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=9B=B6=E6=8B=B7=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Database.md | 8 ++-- OS.md | 82 ++++++++++++++++++++++++++++++++++ images/OS/Zero-Copy.png | Bin 0 -> 40550 bytes images/OS/利用DMA技术.png | Bin 0 -> 18366 bytes 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 images/OS/Zero-Copy.png create mode 100644 images/OS/利用DMA技术.png diff --git a/Database.md b/Database.md index 9c5148d..3a3aba1 100644 --- a/Database.md +++ b/Database.md @@ -1946,10 +1946,12 @@ Hash table size 553229, node heap has 17 buffer(s) -**作用** +**binlog使用场景** + +在实际应用中, `binlog` 的主要使用场景有两个,分别是 **主从复制** 和 **数据恢复**。 -- **主从复制**:在主从复制中,从库利用主库上的binlog进行重播,实现主从同步 -- **数据恢复**:通过使用mysqlbinlog`工具来实现数据库基于时间点的还原 +- **主从复制**:在 `Master` 端开启 `binlog` ,然后将 `binlog`发送到各个 `Slave` 端, `Slave` 端重放 `binlog` 从而达到主从数据同步 +- **数据恢复**:通过使用`mysqlbinlog`工具来实现数据库基于时间点的还原 diff --git a/OS.md b/OS.md index f7b6d21..145dc94 100644 --- a/OS.md +++ b/OS.md @@ -342,6 +342,88 @@ epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它 +## 零拷贝(Zero-Copy) + +### 数据的四次拷贝与四次上下文切换 + +很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用: + +- File.read(file, buf, len); +- Socket.send(socket, buf, len); + +例如消息中间件 Kafka 就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。在没有任何优化技术使用的背景下,操作系统为此会进行 4 次数据拷贝,以及 4 次上下文切换,如下图所示: + +![Zero-Copy](images/OS/Zero-Copy.png) + +如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差: + +**4次copy** + +- CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中 +- CPU 负责将数据从内核空间的 Socket 缓冲区搬运到的网络中 +- CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区 +- CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区中 + +**4次上下文切换** + +- read 系统调用时:用户态切换到内核态 +- read 系统调用完毕:内核态切换回用户态 +- write 系统调用时:用户态切换到内核态 +- write 系统调用完毕:内核态切换回用户态 + +**问题分析** + +- CPU 全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于 CPU +- 4 次 copy 太多了,4 次上下文切换也太频繁了 + + + +### 零拷贝技术 + +零拷贝技术是一个思想,指的是指计算机执行操作时,CPU 不需要先将数据从某处内存复制到另一个特定区域。 + +可见,零拷贝的特点是 CPU 不全程负责内存中的数据写入其他组件,CPU 仅仅起到管理的作用。但注意,零拷贝不是不进行拷贝,而是 CPU 不再全程负责数据拷贝时的搬运工作。如果数据本身不在内存中,那么必须先通过某种方式拷贝到内存中(这个过程 CPU 可以不参与),因为数据只有在内存中,才能被转移,才能被 CPU 直接读取计算。 + +零拷贝技术的具体实现方式有很多,例如: + +- **sendfile** +- **mmap** +- **splice** +- **直接 Direct I/O** + +不同的零拷贝技术适用于不同的应用场景,下面依次进行 sendfile、mmap、Direct I/O 的分析。 + +- DMA 技术回顾:DMA 负责内存与其他组件之间的数据拷贝,CPU 仅需负责管理,而无需负责全程的数据拷贝; +- 使用 page cache 的 zero copy: +- sendfile:一次代替 read/write 系统调用,通过使用 DMA 技术以及传递文件描述符,实现了 zero copy +- mmap:仅代替 read 系统调用,将内核空间地址映射为用户空间地址,write 操作直接作用于内核空间。通过 DMA 技术以及地址映射技术,用户空间与内核空间无须数据拷贝,实现了 zero copy +- 不使用 page cache 的 Direct I/O:读写操作直接在磁盘上进行,不使用 page cache 机制,通常结合用户空间的用户缓存使用。通过 DMA 技术直接与磁盘/网卡进行数据交互,实现了 zero copy + +#### sendfile + +snedfile 的应用场景是用户从磁盘读取一些文件数据后不需要经过任何计算与处理就通过网络传输出去。此场景的典型应用是消息队列。在传统 I/O 下,上述应用场景的一次数据传输需要四次 CPU 全权负责的拷贝与四次上下文切换。sendfile 主要使用到了两个技术: + +- DMA 技术 +- 传递文件描述符代替数据拷贝 + +**利用DMA技术** + +sendfile 依赖于 DMA 技术,将四次 CPU 全程负责的拷贝与四次上下文切换减少到两次,如下图所示: + +![利用DMA技术](images/OS/利用DMA技术.png) + +利用 DMA 技术减少 2 次 CPU 全程参与的拷贝DMA 负责磁盘到内核空间中的 Page cache(read buffer)的数据拷贝以及从内核空间中的 socket buffer 到网卡的数据拷贝。 + + + +https://blog.csdn.net/weixin_38726452/article/details/120168360 + + + +https://mp.weixin.qq.com/s?__biz=Mzg4MDAxNzkyMw==&mid=2247489694&idx=1&sn=3c9f532eb9d650b2ae2b1db5d0c91b09&chksm=cf7acff2f80d46e431c0bd0d60270a8ce3d31af8a50678e11d5b39bb6c8a9dfa333e7ac56704&mpshare=1&scene=23&srcid=0903RuYh2ynm5j60Y7QtETJO&sharer_sharetime=1638369376739&sharer_shareid=0f9991a2eb945ab493c13ed9bfb8bf4b%23rd + + + ## BIO(同步阻塞I/O) 每个客户端的Socket连接请求,服务端都会对应有个处理线程与之对应,对于没有分配到处理线程的连接就会被阻塞或者拒绝。相当于是`一个连接一个线程`。 diff --git a/images/OS/Zero-Copy.png b/images/OS/Zero-Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..c653e4c8d98e66d98c325e0484e4624d62241063 GIT binary patch literal 40550 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 literal 0 HcmV?d00001 diff --git a/images/OS/利用DMA技术.png b/images/OS/利用DMA技术.png new file mode 100644 index 0000000000000000000000000000000000000000..896ab2a4ca79df0a0b1451bd82155ba692155c51 GIT binary patch literal 18366 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