From cc418196baa4cf5de4014c414b76da89d7dce322 Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Sun, 29 Sep 2024 17:32:03 +0800 Subject: [PATCH 1/6] add daily knowledge --- C and C++.txt | 4 +++- file_system.txt | 2 +- network.txt | 2 ++ storage.txt | 13 +++++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/C and C++.txt b/C and C++.txt index 6510f1c..7915848 100644 --- a/C and C++.txt +++ b/C and C++.txt @@ -229,7 +229,7 @@ 26、Uncopyable 怎么实现? (tips:一种简单的实现是 在类中定义private 拷贝构造函数,但是这种方式不够清晰 - 更好的做法是 定义个 模板类,定义 pravate的拷贝构造函数,然后 子类 private 继承 + 更好的做法是 定义个 模板类,定义 private的拷贝构造函数,然后 子类 private 继承 Uncopyable 类) 27、C++里面的匿名namespace中的成员,相当于添加了static属性,因为编译器实际上会为每一个匿名的namespace @@ -247,6 +247,8 @@ 其实,如果是由object来调用虚函数,那么函数可以inline; 但是如果通过指针或者引用来访问,那么就走运行时多态特性了,即拿到类对象指针,访问虚函数表, 解引用对应function pointer,整个过程中必须有call指令调用 + +32、std::string 是二进制安全的,但需要注意,如果存储的是二进制数据,则禁止使用 length() size() c_str()等函数 // debug diff --git a/file_system.txt b/file_system.txt index 4039a9f..61b3df5 100644 --- a/file_system.txt +++ b/file_system.txt @@ -582,7 +582,7 @@ 如果第一个盘损坏,则整个数据将不可读。 178、du 和 df 展示的结果不同,数据对不上,这是因为du基于stat系统调用,看到的是一个文件的数据; - df 使用的是 statvfs 系统调用,是展示整个系统或分区的角度来获取数据;du可能还要考虑follow + df 使用 statvfs 系统调用读取superblock展示整个系统或分区的角度来获取数据;du可能还要考虑follow symlink或 hard link的重复计算,而 df 可能还需要考虑系统预留空间,inode的inline data, journal 的预留空间等 diff --git a/network.txt b/network.txt index fea0676..dbec991 100644 --- a/network.txt +++ b/network.txt @@ -791,3 +791,5 @@ 即,上面和进程关联时使用 ss 命令同样可以查看网络socket的信息,但是ss使用的是 netlink,一种更适合于传输大量数据的内核-用户态通信方式, 但是这两个命令都会 lock sock list + +41、DNS对于域名的长度有限制,整个域名限制253bytes,每一个段域名限制64bytes diff --git a/storage.txt b/storage.txt index d43e868..d39d8fe 100644 --- a/storage.txt +++ b/storage.txt @@ -96,3 +96,16 @@ 22、在使用 smartctl 查询不到对应nvme设备的 smart-log 后,可以尝试使用 sudo nvme smart-log /dev/nvme 查看 23、当前3D TLC是企业级固态存储的主要介质选择 + +24、rsync是否支持增量复制,实现方案是啥? + +25、dd 和 rsync 哪个拷贝数据更快? +(备注:dd 会全盘拷贝,包括文件系统级的元数据,但是rsync是走文件系统的,如果盘空载的话,rsync更快) + +26、还有一种压缩后,通过ssh备份的方案 +(备注:不压缩 tar cvf - folder_to_compress | ssh remote_user@your_remote_host 'tar xvf - -C /remote/directory' +压缩 tar czvf - folder_to_compress | ssh remote_user@your_remote_host 'tar xzvf - -C /remote/directory' ) + +27、linux shred 工具可以完成磁盘上数据的安全擦除,但是数据的擦除效率不高(工具的iosize 默认64KB,应该可以调大),20T盘的擦除带宽在90M。 + HDD 支持sanitize特性也可以完成磁盘上数据擦除,工具是sg_sanitize + 业界也有数据擦除规范(例如,美丽国国防部标准) From 4acedf3c47e3665017ea17a7658d0340a26f89b0 Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Wed, 30 Oct 2024 15:05:25 +0800 Subject: [PATCH 2/6] add localhost & 127.0.0.1 --- network.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/network.txt b/network.txt index dbec991..60867cd 100644 --- a/network.txt +++ b/network.txt @@ -26,6 +26,12 @@ 3、什么是VxLAN? (tips:扩展版的VLAN,具体作用后面再补充) +4、localhost和127.0.0.1有啥区别 + (tips: 当前系统在初始化时会在/etc/hosts中预先配置好 localhost 将被解析到127.0.0.1, + 如果手动删掉这一行,则会向DNS server请求解析localhosts。ping localhost 和 ping 127.0.0.1 + 的区别就是前者多了一步查询/etc/hosts的步骤,对应的ICMP数据包依然需要通过loopback网卡进行转发, + 使用 tcpdump -i any 可以抓到对应的包) + // UDP 1、UDP 可以使用connect吗? From 626f997f28cd4f28804c644a11c705ef9603fc11 Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Wed, 19 Feb 2025 14:47:20 +0800 Subject: [PATCH 3/6] add mm & pagefault related --- file_system.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/file_system.txt b/file_system.txt index 61b3df5..e49a54b 100644 --- a/file_system.txt +++ b/file_system.txt @@ -787,6 +787,11 @@ 最后问题怀疑点是 /procy 文件系统实现时有一把全局的mutex,怀疑大并发访问导致锁争用 sysak 貌似开源了 +216、线上遇到机器内存紧张时,将clean的 exec page swap out,刚好对应磁盘访问慢,导致进程执行到 + 对应page时,触发page fault,但因为load慢,进而导致进程hang + (注:一个解决办法就是使用mmap 将对应binary以LOCKED模式映射到内存,但这里有个点就是会 + 将其他data段等内容也一并加入内存,这里的思路和上面vmtouch有点像) + // block layer 1、io_submit调用理论上是非阻塞的,但是如果执行sync写入,或者有meta data I/O,或者,设备中能提供的 request数量有限,如果超过这个限制,也只能阻塞进入等待。 From 55885fe45466a01dc767cc9727ed2a5e1a9c1b3c Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Wed, 19 Feb 2025 14:48:04 +0800 Subject: [PATCH 4/6] add storage hardware (SSD & HDD) related --- storage.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/storage.txt b/storage.txt index d39d8fe..c78d296 100644 --- a/storage.txt +++ b/storage.txt @@ -74,9 +74,13 @@ 17、hot spare disk(热备盘)在RAID组中个别盘不可服务时,可以快速替换出问题的盘,保证业务连续性 -18、PMR 和 CMR含义相同,都表示传统的垂直记录磁盘,特点是磁道与磁道独自;但是磁盘写入时需要的磁场强度高于读取,所以 - 一般情况下写磁头的宽度要大于读磁头,而SMR就刚好利用了这一特点,将相隔的两个磁道进行物理上的重叠, +18、CMR是传统的垂直记录(PMR)磁盘一种,特点是磁道与磁道独立;但磁盘写入时需要的磁场强度高于读取,所以 + 实现上写磁头的宽度大于读磁头,而SMR就刚好利用了这一特点,将相隔的两个磁道之间冗余的读磁道进行物理上的重叠, 这样在相同磁盘尺寸的情况下,可以存储更多的数据 + 还有HARM 和 MAMR 两种技术用来提高磁盘的存储密度,但磁盘空间提高后,需要考虑单盘数据恢复时长 + 之前的经验数据是10h/TB,当磁盘容量达到14TB时,恢复一块盘的时间可能需要一周左右 + 同时,SMR盘的随机写性能很低(类似SSD,需要先拷贝,修改,再写回),需要存储软件在架构上E2E的进行优化 + 19、在数据中心成本计算中,设备(包括存储设置)占用的机架空间也需要考虑 @@ -109,3 +113,6 @@ 27、linux shred 工具可以完成磁盘上数据的安全擦除,但是数据的擦除效率不高(工具的iosize 默认64KB,应该可以调大),20T盘的擦除带宽在90M。 HDD 支持sanitize特性也可以完成磁盘上数据擦除,工具是sg_sanitize 业界也有数据擦除规范(例如,美丽国国防部标准) + +28、Intel P4510 是比较常用的企业级TLC SSD + Intel P5800 是之前研发的optane SSD From 41d2af5e0140aca406feba25196ed11f7e0e3ca1 Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Fri, 30 May 2025 15:36:39 +0800 Subject: [PATCH 5/6] add recently knowledge --- awesome_project.txt | 2 ++ docker.txt | 8 ++++++++ git.txt | 10 ++++++++++ network.txt | 4 ++++ tools.txt | 2 +- website_url.txt | 2 ++ 6 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 docker.txt create mode 100644 git.txt create mode 100644 website_url.txt diff --git a/awesome_project.txt b/awesome_project.txt index 398ff65..f2ae3cf 100644 --- a/awesome_project.txt +++ b/awesome_project.txt @@ -1,2 +1,4 @@ +// 记录一些值得深入研究的开源项目 + 1、ext3grep url: https://code.google.com/archive/p/ext3grep/source/default/source diff --git a/docker.txt b/docker.txt new file mode 100644 index 0000000..ed934f4 --- /dev/null +++ b/docker.txt @@ -0,0 +1,8 @@ +// 记录docker相关知识点 + +1、之前一直没有留意,在宿主机上使用ps 或 top 等命令是可以看到docker内进程信息的,但由于namespace隔离机制, + docker内部是无法看到宿主os的进程信息 + +2、怎么确认一个进程是由docker启动的? + (tips:从上面 1 中由ps 或 top 获取进程pid,然后cat /proc/${pid}/cgroup | grep docker,如果有输出,则可以确认进程 + 由docker创建; 另外,也可以使用 docker inspect 来反向验证) \ No newline at end of file diff --git a/git.txt b/git.txt new file mode 100644 index 0000000..c925f84 --- /dev/null +++ b/git.txt @@ -0,0 +1,10 @@ +// record awsome git tool + +1、当远端git仓库不支持添加ssh public key的方式进行免密访问时,可以使用 git config --global credential.helper store 命令,在随后的git 命令中再次输入账密后, + git会自动记录账号 密码,之后的访问就可以免密 + +2、git clone 下载代码hang住时,如果排除了基本的网络和权限原因外,还是不能发现问题,可以尝试 + GIT_TRACE=1 git clone ${git_url} + 上述命令会展示git clone的细节,比 git clone --verbose 还要详细 + +3、查看一个被删除文件的log时,可以使用 git log --all --full-history -- \ No newline at end of file diff --git a/network.txt b/network.txt index 60867cd..c7a967e 100644 --- a/network.txt +++ b/network.txt @@ -79,6 +79,10 @@ 6、客户端可以创建多少个socket?(同一个IP地址) 7、epoll poll select 区别与联系? + (tips:select实现了基本的IO多路复用,但是一是支持的fdset数量固定,受一个内核宏的控制 + 而且不好修改,之前有人尝试改过,但效果不佳,内核会panic,二是select基于遍历操作,时间复杂度是O(N), + 三是fdset需要频繁的在用户空间和内核空间进行拷贝;poll则针对待监听fd数量进行了优化; + epoll则针对上述三项分别进行了优化) 8、epoll 中 LT ET 区别,使用场景? (tips:ET中,如果没有read socket到 EAGAIN,有可能导致整个处理过程阻塞, diff --git a/tools.txt b/tools.txt index 524ebe7..c30d945 100644 --- a/tools.txt +++ b/tools.txt @@ -1,4 +1,4 @@ -this doc record some useful tools to trace problem or optimize performance +// this doc record some useful tools to trace problem or optimize performance #No.1 dropwatch 用来查看机器丢包信息,辅助定位网络问题 diff --git a/website_url.txt b/website_url.txt new file mode 100644 index 0000000..936d450 --- /dev/null +++ b/website_url.txt @@ -0,0 +1,2 @@ +// 记录一些 awsome 网站 +1、linux-commits-search.typesense.org 内核commit搜索网站 \ No newline at end of file From dc3527db233b1872f3fc75a54a9799b4d7e7a8ae Mon Sep 17 00:00:00 2001 From: coderall2 <872871337@qq.com> Date: Wed, 2 Jul 2025 13:18:12 +0800 Subject: [PATCH 6/6] add some new notes --- Windows.txt | 7 +++++++ awesome_project.txt | 35 +++++++++++++++++++++++++++++++++++ file_system.txt | 3 +++ 3 files changed, 45 insertions(+) create mode 100644 Windows.txt diff --git a/Windows.txt b/Windows.txt new file mode 100644 index 0000000..a69aea4 --- /dev/null +++ b/Windows.txt @@ -0,0 +1,7 @@ +// 记录Windows平台相关资料 + +1、Windows上开发跨平台应用三件套 Cygwin Msys2 MinGW,其中Cygwin提供了Unix风格的bash命令行以及很多常用的工具,例如grep,awk,find这些, +Msys2 在CygWin基础上提供了开发环境,包括包管理器pacman;MinGW的目标是在Windows环境上使用gcc工具链编译出native exe程序。 +结合这三者,可以让一个熟悉Linux的开发者无缝切换到Windows平台上开发。 + +2、MinGW的实现中要考虑翻译Linux的系统调用,例如,fork,clone这些原生Linux system call在Windows上的实现 \ No newline at end of file diff --git a/awesome_project.txt b/awesome_project.txt index f2ae3cf..ba7fa17 100644 --- a/awesome_project.txt +++ b/awesome_project.txt @@ -2,3 +2,38 @@ 1、ext3grep url: https://code.google.com/archive/p/ext3grep/source/default/source + +2、 MooseFS 一个分布式存储实现 + url: https://github.com/moosefs/moosefs + +3、 JuiceFS 一个兼容POSIX的云存储代理 + url: https://github.com/juicedata/juicefs + (主要实现特性:juicefs不仅仅是一个后端存储的代理,其本身针对大文件做了一层切分,并且引入了可配置的元数据管理层) + +4、 winfsp 参考dokan,windows上fuse的新版本实现 + url: https://github.com/winfsp/winfsp/tree/master + +5、 dokan 早期windows上fuse实现 + url: https://github.com/dokan-dev/dokany + +6、 S3 开源fuse实现,当前在windows平台上已集成winfsp + url: https://github.com/s3fs-fuse/s3fs-fuse + +7、 Windows原生支持的Linux虚拟机 + url: https://github.com/microsoft/WSL + +8、 rsync,一款命令行数据备份工具,可以参考数据校验,数据传输,以及基于chunk细粒度的数据同步算法,而不仅仅将视野局限于DRS + url: https://github.com/RsyncProject/rsync + +8、 rclone,rsync的云端存储版本 + url: https://github.com/rclone/rclone + +9、 libuv,一个跨平台的异步IO框架,支持TCP、 UDP、 File IO、 File Event,当前主要应用于Node中 + url: https://github.com/libuv/libuv + +10、 Windows Driver Sample,Windows官方提供的驱动程序示例库,在里面可以看到多种驱动的源码 + url: https://github.com/microsoft/Windows-driver-samples/tree/main + (tips: 可以借鉴FastFAT文件系统驱动) + +11、 libfuse,用户态FUSE库,提升开发Linux用户态文件系统效率 + url: https://github.com/libfuse/libfuse diff --git a/file_system.txt b/file_system.txt index e49a54b..1912a6c 100644 --- a/file_system.txt +++ b/file_system.txt @@ -791,6 +791,9 @@ 对应page时,触发page fault,但因为load慢,进而导致进程hang (注:一个解决办法就是使用mmap 将对应binary以LOCKED模式映射到内存,但这里有个点就是会 将其他data段等内容也一并加入内存,这里的思路和上面vmtouch有点像) + +// Windows NTFS +1、介绍NTFS原理的书籍可以参考《Windows NT文件系统内幕》 《NTFS文件系统扇区存储探秘》 ,开源项目可以参考ntfs-3G,同时内核中也有对应的NTFS驱动代码 // block layer 1、io_submit调用理论上是非阻塞的,但是如果执行sync写入,或者有meta data I/O,或者,设备中能提供的