![仅在没有读取活动时刷新写入缓存](https://linux22.com/image/774624/%E4%BB%85%E5%9C%A8%E6%B2%A1%E6%9C%89%E8%AF%BB%E5%8F%96%E6%B4%BB%E5%8A%A8%E6%97%B6%E5%88%B7%E6%96%B0%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98.png)
通常,如果超出指定时间限制或缓存已满,Linux 内核会刷新写入缓存。这会导致 HDD 停滞,因为写入过程会使读取过程变慢很多。
这就是为什么我希望在只有少量读取活动时避免刷新写入缓存。由于我有 40 GB 的 RAM,所以这应该不是问题。我的想法是将时间限制设置为五分钟,根据需要调整写入缓存大小,并编写一个脚本,仅在读取活动为 0 时刷新缓存。我不知道该怎么做,shell 命令是否能sync
提供足够好的性能?
我的目标是拥有一个大小为 1、2 GB 的写入缓存。刷新这个缓存需要很长时间。有什么可以在再次出现读取活动或更高的磁盘 PSI 时停止的吗(这会反应得足够快吗??)
我有两个 Seagate(非 smr?)硬盘:ST1000DM010-2EP102 - 但我想不需要这些信息。
我dirty_ratio
当前设置了一个动态缓存大小。
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
这会将开始刷新写入缓存的最大时间设置为 1 小时。
有用的命令:
使用以下命令,您可以查看写入缓存中有多少内容:
cat /proc/meminfo | grep Dirty
输出:
Dirty: 104 kB
但这不是很重要。
我被困在哪儿了?
我希望能够几乎立即取消同步命令(这可能吗),并且我想知道是否有进程正在读取。这就是我编写脚本所需要的全部内容。
我发现了一个能够监控读取活动的旧脚本:awk '{print $1}' /sys/block/sdb/stat
如何使用它?
if [ $old-value -lt $new-value ];then COMMAND;fi
答案1
使用来源: https://askubuntu.com/questions/184204/how-do-i-fetch-only-numbers-in-grep https://www.kernel.org/doc/html/latest/block/stat.html https://askubuntu.com/questions/184204/how-do-i-fetch-only-numbers-in-grep
我编写的脚本:
#!/bin/bash
oldreads=0
killed=True
while (true)
do
reads=`awk '{print $1}' /sys/block/sdb/stat`
if [ "$oldreads" == "$reads" ]
then
if [ $(grep -o '[[:digit:]]*'<<<$(cat /proc/meminfo | grep Dirty)) -gt 10240 ]
then
echo "sync"
sync&
syncPid="$!"
oldreads="$reads"
killed=False
else
echo "There's not more than a 10 MB in the write buffer, not syncing."
fi
elif [ $killed == False ]
then
echo "kill"
kill "$syncPid"
killed=True
else
echo "$oldreads => $reads"
oldreads="$reads"
fi
sleep 1
done