Linuxer's Blog

世界很大,我太渺小

程序员的乐趣

今天听到一句非常有深意的话:

"如果你在提问的同时放弃了思考,你已经失去了一个程序员的最基本的乐趣!"

Linux cached and buffers memory

我们都知道Linux 的free memory是有两种算法的,一种是系统实际剩余的物理内存,一种是加上系统的cached住的临时缓存后的总剩余内存数,如下面标示的两个free值。

total       used       free     shared    buffers     cached
Mem:       1986376     891920    1094456          0      44352     462224
-/+ buffers/cache:     385344    1601032
Swap:      3695604          0    3695604

内核通过一组内核线程pdflush去管理缓存,有三种方式去释放缓存区。

1. 当脏缓存页保留一段时间后,内核就会显式地开始把脏页写到磁盘。

2. 缓存区达到一定阀值时,pdflush会去主动回收。

3. 使用sync、fsync和fdatasync系统调用将缓存区刷新到磁盘。

所以那些buffers、cached中的缓存空间,在系统需要的时候,它会主动让出空间来做它用。

buffers和cached的区别主要是, buffers是块设备的读写缓存区,是物理级的,如你对裸盘的读写。cached是作为page caches,是针对文件系统的页缓存,文件的读写都是缓存在这里面的。page cache的数据需要刷新时,page cache中的数据交给buffer cache(这种操作在2.6内核后变的简单了,具体怎么简单?)。

手动回收cache的方法:

方法一:

# And free up caches
#
echo Freeing the page cache:
echo 1 > /proc/sys/vm/drop_caches
echo Free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
echo Free the page cache, dentries and the inodes:
echo 3 > /proc/sys/vm/drop_caches

当然这种方法也适用与sysctl。

方法二:

fcntl(fd, F_SETFL, O_DIRECT)

对文件描述符设置O_DRECT,会避免cache该文件的内容,直接读写磁盘。在大量数据传输的时候,会避免占用大量缓存,而且传输效率也不会下降什么。

方法三:

降低如下阀值的数值,有利于回收缓存,但会影响性能,这些设置要根据具体环境来调优。

/proc/sys/vm/dirty_ratio

/proc/sys/vm/dirty_background_ratio

/proc/sys/vm/dirty_expire_centisecs

方法四:

sysctl -w vm.vfs_cache_pressure=n  (n > 100)

这会使Kernel更勤于回收cache。

回味老漫画:神秘的程序员们zz

原文地址:http://news.cnblogs.com/n/76718/

偶尔逛论坛,发现了这么一组关于程序员的老漫画。给大家分享下。这个系列的漫画讲述程序员——这种神秘人类的囧事,故事多来源于我身边的程序员朋友,且以互联网开发背景为主。

学习感悟

最近做事做着,倒是挺忙活的,但发现自己的基础是越来越生疏了。以前看过的东西,最近都没什么概念啦。也是这屁事做的没一点技术含量,用到的东西比较少。这些时间来的学习,感悟挺多的。学习需要技巧,IT技术行业的学习更需要技巧,信息量太大,更新太快!这里总结一些以后要注意的学习技巧。

 

1. 做事情应该有结构和流程框架的思维方式,就像写代码,不能一股脑儿的奔着目标功能去,要有结构和流程。看代码也是的,要去看Coder的代码结构风格和整体的框架。尤其是阅读一些优秀的开源代码,你要相信你能从中学到很多东西。关注代码中的知识点很重要,这样你能有印象(巩固了基础),会思考别人是怎么用的,这样用有什么好处。就像下面这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>

#include <sys/stat.h>
#include <fcntl.h>

void event_loop()
{
	for(;;) {
		sleep(10);
		printf("Do something...\n");
	}
}

void main()
{
	pid_t pid;
	int fd;
	char buf[64];

	pid = fork();
	if(pid < 0)
		exit(1);
	if(pid > 0)
		exit(0);

	fd = open("/var/run/daemon.pid", O_WRONLY|O_CREAT, 644);
	if(fd < 0) {
		printf("unable to create pid file.\n");
		exit(1);
	}
	if(lockf(fd, F_LOCK, 0) < 0) {
		printf("unable to lock pid file.\n");
		exit(1);
	}

	ftruncate(fd, 0);
	sprintf(buf, "%d", getpid());
	write(fd, buf, strlen(buf));

	close(0);
	open("/dev/null", O_RDWR);
	dup2(0, 1);
	dup2(0, 2);

	setsid(); // Create a new session.

	chdir("/");

	umask(0);

	event_loop();
}

这是一个简单的后台守护进程的框架,多去关注这种架构,而不是被Coder带着跟着他的流程走,这样我们虽然会在迷宫中找到出口,但我们出去了,依然对迷宫一无所知。

2.  多看代码;代码里面存在真理,其他一切都是猜想。我有个同事说他看了iscsi-target的代码,感悟很深,对用户态,内核态交互,对以前看的LDD3有了更深的理解(可以称为升华?)。

3. 多看一些经典书籍,如O'Reilly等。工作上的事,很多都是表象的事情,或者由于做的太专,而长期扎在里满,或许你的工作效率更高了,但知识积累并没有随着效率提高而增长。所以业余时间的学习很重要,我们这个行业是最需要学习的行业,不断的学习!

4. 代码输出或文字输出;曾听一位前辈讲课说,输出的东西,才是真正自己的东西。很多人应该有这样的经历,就是你知道这事应该怎么做,你上机很快就能把它写出来,但让你说出原理,说的让别人听的明白(甚至一些不懂技术的人),这会让你反复的解释,反复的比划或许别人还是没能听懂。把一些多维,结构性的东西压成一根线条样的语言表述出来,确实需要很好的组织语言的能力。写代码也是的,把你的代码一行一行,一个字母一个字母的输出来,表述你的设计,也要经过长期的实践才能。我现在写这篇blog就觉得我吸收前辈课堂上的经验,但却一塌糊涂的表述他的观点,这也是为什么要常要求自己写blog的原因。

 

经验、技巧--> 多看代码,书籍 --> 思考,总结 --> 写代码,blog

强调方法          强调输入                强调思考           强调输出

知识需要流动!

Hello World!

世界很大,我太渺小。

Keep hungry, Keep foolish