查看我的 Linux 机器上 VFS 缓存的行为,我可以看到,即使在有效空闲时(crond 和大多数其他守护程序停止,接口关闭),可用内存量也会逐渐增加,这意味着项目正在从缓存中逐出。
我做了很多谷歌搜索,但找不到任何关于如何控制的参考(除非它是 vm_swappiness 的副作用)。任何人都可以让我走上正确的道路来理解为什么在不需要新内存分配的情况下会从缓存中逐出项目?
假设我以这种方式挂载了一个磁盘:
mount /dev/sdb /mnt/tmp
Run Code Online (Sandbox Code Playgroud)
我在这个文件系统上打开了一些文件,不想卸载它。但是我想暂时提取设备,然后再重新连接它。我希望对该文件系统的所有读取和写入仅在缓存中执行或挂起,直到我重新连接设备。
如果我想提前暂时分离,我会使用设备映射器:
# ls -lh /dev/sdb
brw-rw---- 1 root floppy 8, 16 Sep 12 17:38 /dev/sdb
# blockdev --getsize /dev/sdb
2211840
# dmsetup create sdb_detachable --table '0 2211840 linear 8:16 0'
# mount /dev/mapper/sdb_detachable /mnt/tmp
(start working with the filesystem)
(suddenly need to detach the device)
# dmsetup suspend sdb_detachable
# dmsetup load sdb_detachable --table '0 2211840 error'
# blockdev --flushbufs /dev/sdb
(eject the device)
(maybe even use the cached part of the filesystem)
(reattach the …
Run Code Online (Sandbox Code Playgroud) 在阅读了一些关于 Linux VFS 页面缓存和可调参数的文章后,dirty_ratio
我的印象是页面缓存将作为读写缓存层运行。
但是使用下面的简单测试可以很好地提高位于页面缓存中但似乎不适用于写入的文件的读取速度。
例如
清除缓存并写入文件。
# swapoff -a
# echo 3 > /proc/sys/vm/drop_caches
# dd if=/dev/zero of=/home/flo/test bs=1M count=30
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.182474 s, 172 MB/s
Run Code Online (Sandbox Code Playgroud)
检查文件实际上是否在页面缓存中
# vmtouch /home/flo/test
Files: 1
Directories: 0
Resident Pages: 7680/7680 30M/30M 100%
Elapsed: 0.000673 seconds
Run Code Online (Sandbox Code Playgroud)
从文件中读取以确认实际上来自缓存。
# dd if=/home/flo/test of=/dev/null bs=1M count=30
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.00824169 s, 3.8 GB/s
Run Code Online (Sandbox Code Playgroud)
删除缓存并再次读取以证明速度差异。
# echo 3 …
Run Code Online (Sandbox Code Playgroud) 在 Linux 上,openat
系统调用可用于创建文件并测试它们的存在。就 C/C++ 内存模型而言,创建文件并验证其存在会创建同步关系。我需要知道的是这些同步是否都彼此顺序一致。(我当然希望如此,但我实际上并没有在任何地方看到这种记录。)
例如,给定进程 p1 和 p2,以及路径 A 和 B:
如果 p1 这样做:create(A),然后 create(B)
p2 这样做:尝试打开(B),然后尝试打开(A)
并且没有其他进程干扰A或B,是否有可能p2成功打开B但找不到A?
如果它有所不同,我们可以假设所有操作都在一个文件系统中。
我按照这里的步骤在用户模式下成功编译了内核:https : //btrfs.wiki.kernel.org/index.php/Debugging_Btrfs_with_GDB
但是当我./linux
以各种方式开始时,它总是给我一个非常相似的错误:
pc@linux-94q0:~/linux-4.11-rc4> ./linux root=/mnt
Core dump limits :
soft - 0
hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking environment variables for a tempdir...none found
Checking if /dev/shm is on tmpfs...OK
Checking PROT_EXEC mmap in /dev/shm...OK
Adding 33251328 bytes to physical memory to account for exec-shield gap
Linux version 4.11.0-rc4 (pc@linux-94q0) (gcc version 4.8.5 (SUSE Linux) ) …
Run Code Online (Sandbox Code Playgroud) 我正在学习 Linux procfs
,它利用虚拟文件系统,其中open
、read
、write
、 和 等操作release
由注册到其中的函数处理。
我错误地将open
andrelease
保留为空指针,当我尝试读取文件的内容时,使用如下 Python 代码:
with open("/proc/testfile", "r") as f:
content = f.read()
Run Code Online (Sandbox Code Playgroud)
程序卡住了,我从内核 dmesg 中读取到空指针被取消引用的错误,这是预期的,因为它open
指向 NULL。
然而,cat
GNU coreutils 的命令可以完成这项工作,给我输出如下
$ cat /proc/testfile
testoutput
Run Code Online (Sandbox Code Playgroud)
这意味着cat
没有调用该open
函数而是直接调用read
(write
也可以这样做)。
根据我的理解,open()
将返回一个文件描述符,该文件描述符进一步用于处理文件,并且read()
需要文件描述符才能继续。
这在里面是怎么做到的cat
?
vfs ×6
linux ×3
benchmark ×1
btrfs ×1
cache ×1
cat ×1
concurrency ×1
dd ×1
external-hdd ×1
filesystems ×1
hard-disk ×1
linux-kernel ×1
proc ×1
storage ×1
usb-drive ×1