# getconf PAGESIZE
4096
[flush-8:48]
。 /proc/sys/vm/
目录下的内核参数控制脏页回写行为: 参数 | 描述 |
---|---|
dirty_background_ratio | 占全部内存的百分比,当脏页数量超过该比例时,pdflush机制开始(在后台)回写脏页.此时对write调用没有影响 |
dirty_background_bytes | 同上,以字节描述。与dirty_background_ratio不可同时生效 |
dirty_writeback_centisecs | pdflush线程运行的频率,单位1/100秒。默认500,即pdflush两次调用间隔是5秒。早期版本该参数可能是 dirty_writeback_interval |
dirty_ratio | 脏页占全部内存的比例,超出该阈值时脏页开始刷出。此时新的IO请求可能会被阻塞直到脏页刷完 |
dirty_bytes | 同上,以字节描述。与dirty_ratio不可同时生效 |
dirty_expire_centisecs | 以百分之一秒为单位,默认3000.即超时30秒的脏页将会被pdflush线程写出,或者说一个脏页在回写之前,保持脏页状态最长可达30秒 |
- 在写密集的系统中,通常可配置dirty_ratio
较高(如60)以增大可用缓存、dirty_background_ratio
较低(如20)以遍在后台及时将数据刷入磁盘。同时保持dirty_writeback_centisecs
较高(如5秒)
- 内核源码中好像有一个检查,dirty_background_ratio
不能大于dirty_ratio
的1/2,否则内核会自动调整为后者的1/2.参见内核代码global_dirty_limits()
函数:
void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty)
{
……
if (background >= dirty)
background = dirty / 2;
……
}
sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数
do_sync()
会调用2次sync_inodes()
和sync_filesystems()
,第一次传参数0,表示异步执行;第二次传参数1,表示同步执行. fdatasync()
它多了一次IO操作。对于机械盘来说,这个耗时通常是毫秒(平均10ms左右)级别的!! fync()
不保证其所在目录也被刷到磁盘,因此针对其所在目录显示调用一次 fsync()
是有必要的 1.每个log文件固定为10MB大小,从1开始编号,名称格式为“log.%010d”
2.每次log文件创建时,先写文件的最后1个page,将log文件扩展为10MB大小
3.向log文件中追加记录时,由于文件的尺寸不发生变化,使用fdatasync可以大大优化写log的效率
4.如果一个log文件写满了,则新建一个log文件,也只有一次同步metadata的开销
#define PLATFORM_DEFAULT_SYNC_METHOD_STR "fdatasync"
#define DEFAULT_SYNC_METHOD_STR PLATFORM_DEFAULT_SYNC_METHOD_ST
const char XLOG_sync_method_default[] = DEFAULT_SYNC_METHOD_STR;
static struct config_string ConfigureNamesString[] =
{
……
{
{"wal_sync_method", PGC_SIGHUP, WAL_SETTINGS,
gettext_noop("Selects the method used for forcing WAL updates to disk."),
NULL,
GUC_NOT_IN_SAMPLE | GUC_NO_SHOW_ALL | GUC_DISALLOW_USER_SET
},
&XLOG_sync_method,
XLOG_sync_method_default, assign_xlog_sync_method, NULL
},
……
}
#wal_sync_method = fsync # the default is the first option
# supported by the operating system:
# open_datasync
# fdatasync (default on Linux)
# fsync
# fsync_writethrough
# open_sync
int
fdatasync (int fildes)
{
return fsync (fildes);
}
int msync(void *addr, size_t length, int flags);
try_to_free_pages
shrink_zone()
函数中合并 echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
time find /home/hailong/cache_test -name file* | wc -l
,观察耗时 echo 1 > /proc/sys/vm/drop_caches
之后再次执行上述命令,观察耗时 echo 2 > /proc/sys/vm/drop_caches
之后再次执行上述命令,观察耗时 echo 1
对上述命令执行没有影响。但echo 2
之后该命令执行耗时明显变长。同理,echo 3
也类似。 time wc -l file1.csv
,观察每次执行所用时间。然后再不清理缓存情况下,多次执行time wc -l file2.csv
,观察每次执行所用时间。[root~]# free -g
total used free shared buffers cached
Mem: 62 10 52 0 0 2
-/+ buffers/cache: 7 55
Swap: 31 0 31
[root]# ls -lhtr
total 64G
-rw-r--r-- 1 root root 32G May 3 14:36 file1.csv
-rw-r--r-- 1 root root 32G May 3 14:45 file2.csv
PS:执行结果可知,上述链接中提到的问题已经修复(CentOS 6.5)。但和我们预期的简单LRU可能不太一样,并非访问一次file2就完全淘汰file1的cache。事实上,由于file1曾经被多次访问、已经占据了active链表,file2是随着访问增加,一点一点将file1从cache中“赶”出去的,这也符合上述连接相关的patch修复描述。 但作为对比,如果一开始file1仅被访问1次,然后就wc -l file2,那么file1会马上被“赶出”cache.
linux-fincore
命令: [root]#./linux-fincore --pages=false --summarize --only-cached *
filename size total_pages min_cached page cached_pages cached_size cached_perc
-------- ---- ----------- --------------- ------------ ----------- -----------
aclocal.m4 34,611 9 0 9 36,864 100.00
Could not mmap file: autom4te.cache: No such device
config.log 19,768 5 0 5 20,480 100.00
config.status 29,788 8 0 8 32,768 100.00
configure 171,672 42 0 42 172,032 100.00
configure.ac 864 1 0 1 4,096 100.00
# 图中是在某测试环境中(写入速度大约30MB/s)抓取到的数据.
root@Storage:~# free
total used free shared buffers
Mem: 7800312 7212832 587480 0 12176
Swap: 0 0 0
Total: 7800312 7212832 587480
free的”cache”里也包括了“已使用的”共享内存数据。“已使用的”共享内存数据 是指shmget申请下来后真正写过的数据。
共享内存其实是通过mmap file来实现的,而所有的mmap的内存都是属于file back的,这些内存理所当然的就被统计进cache里了
/proc/meminfo
root@Storage:~# cat /proc/meminfo
MemTotal: 7800312 kB
MemFree: 605236 kB
Buffers: 12192 kB
Cached: 3821896 kB
SwapCached: 0 kB
Active: 4074880 kB
Inactive: 1904592 kB
Active(anon): 2240692 kB
Inactive(anon): 59436 kB
Active(file): 1834188 kB
Inactive(file): 1845156 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 358764 kB
Writeback: 0 kB
AnonPages: 2144676 kB
……