程序员的乐趣
今天听到一句非常有深意的话:
"如果你在提问的同时放弃了思考,你已经失去了一个程序员的最基本的乐趣!"
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