Skip to content

Commit a5861ae

Browse files
committed
add disk related questions
1 parent d475bb8 commit a5861ae

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

C and C++.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@
236236
生成一个名称,且添加using声明,但是这个名称在其他模块是不可见的,这也就添加了internal属性。
237237

238238
28、unique_ptr不能进行拷贝操作,也就是不能直接进行传参和从函数中返回,取而代之的是调用move函数
239+
240+
29、shared_ptr的引用计数更新是线程安全的,但是指针的更新不是,需要注意
239241

240242

241243
// debug

file_system.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,8 @@
476476
158、Ext4 默认开启barrier特性,且 Journal中有校验 checksum,如果乱序写入,且transaction中断,
477477
那么后续的校验将不通过,本次操作会abort;在高端存储磁盘有 battery-backend时,可以考虑关闭
478478
barrier以提高性能
479+
(barrier之前是通过drain request_queue 然后再发送一个flush请求实现的,这样虽然可以达到预期效果,
480+
但是会影响性能)
479481

480482
159、fsync 函数返回EIO错误时,如果直接进行重试,fsync会 clear之前有出错标志的page,
481483
这会潜在的导致数据丢失,Pg数据库目前的做法是fsync返回EIO时,直接panic
@@ -604,6 +606,11 @@
604606
以16KB连续数据为例,需要一个bio结构,里面包括了4个bio_vec;如果数据不连续,则需要多个bio结构
605607

606608
186、使用 echo '' > file 这一步,其实是在open中传入了O_TRUNC标志,进而在打开文件时完成文件长度修改。
609+
(tips:O_TRUNC的实现中,首先对inode->i_mutex加锁,然后修改inode->i_size,再invalid page cache,
610+
这时有一个特殊的点,就是如果这个page mmap到用户态,则需要修改页表,用户的下次访问需要走page fault的流程,
611+
重新读取文件内容
612+
这次还验证了一个场景,一个进程读文件,另一个后台进程覆盖文件内容,那么第一个线程会读取到新内容,
613+
所以说,文件系统并没有保证一致性)
607614

608615
187、在 /etc/mke2fs.conf 文件中有创建文件系统时的默认配置,通过这些配置可以熟悉了解文件系统都实现了哪些功能,
609616
有哪些常用feature
@@ -715,6 +722,10 @@
715722
对于读操作,pgpgin 和 read_bytes 保持同步更新,但是写操作在submit_bio层更新pgpgout,在__set_page_dirty调用
716723
中更新write_bytes
717724

725+
208、磁盘控制器频繁的下发SMART指令,也会对性能产生影响,一般都是分钟级的采样。
726+
这也就带来一个问题,上层怎么快速的发现磁盘的问题,这就要用一些写入测试来辅助,
727+
例如现在在用的 write_test 方法等
728+
718729
// block layer
719730
1、io_submit调用理论上是非阻塞的,但是如果执行sync写入,或者有meta data I/O,或者,设备中能提供的
720731
request数量有限,如果超过这个限制,也只能阻塞进入等待。

0 commit comments

Comments
 (0)