锁定老帖子 主题:项目事故和安全语言
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-28
我话又说回去了:php可以犯错误,可以吃掉整个物理内存。
你关掉apache后,内存还被吃,那就是内核的错误了。 这是两个错误了: 1 php大量内存泄露造成服务器狂慢 2 内核在apache消失后还有大量内存泄露,是内核的错误。 两个不一定相关,但相关的可能性存在。 就是php设计人员这么想:反正进程一结束,那些东西都回收了,但结果是内核回收失败。 内核驱动模块自然也可能造成内存泄露,这就和php一点关系没有了。但运行ruby就好好的,这个可能性也不太能存在。 所以这个问题确实摸不着头脑。 |
|
返回顶楼 | |
发表时间:2006-09-28
ddd 写道 我话又说回去了:php可以犯错误,可以吃掉整个物理内存。
你关掉apache后,内存还被吃,那就是内核的错误了。 这是两个错误了: 1 php大量内存泄露造成服务器狂慢 2 内核在apache消失后还有大量内存泄露,是内核的错误。 两个不一定相关,但相关的可能性存在。 就是php设计人员这么想:反正进程一结束,那些东西都回收了,但结果是内核回收失败。 内核驱动模块自然也可能造成内存泄露,这就和php一点关系没有了。但运行ruby就好好的,这个可能性也不太能存在。 所以这个问题确实摸不着头脑。 关闭apache以后,内存当然不会再吃了,也不知道你怎么看贴的。 我也没有说过PHP内存泄漏造成服务器变慢,事实上速度一点都不慢。 请仔细看我上面贴描述的现象:Apache进程(mod_php)只吃内存,不吐内存!进程关闭之后,进程当前占用的resident内存释放,但是被莫名其妙吃掉的那3GB内存不回吐,根本就无影无踪了。 |
|
返回顶楼 | |
发表时间:2006-09-28
我语言错误
你关掉apache后,已被吃掉内存还处于被吃掉的状态(就是没吐出来的意思),那就是内核的错误了。 不是继续吃的意思。 |
|
返回顶楼 | |
发表时间:2006-09-28
我再来解释一下吧:
物理内存4GB = free memory + buffer + disk cache + resident(系统进程和用户进程占用的驻留内存) 按照上面很多人的看法,只要kernel内存管理没有问题,用户进程关闭之后,内存就全部被释放,那么这个公式就应该一直是一个等式,不管用户进程多么消耗内存。 但问题就是现在的现象是这个等式不成立了! 物理内存4GB = free memory + buffer + disk cache + resident + 3GB(被泄漏掉的部分) 用户进程在运行的过程中,就已经不等了,把用户进程关闭,也只不过释放了该进程的resident,但是物理内存4GB - free memory - buffer - disk cache = 3GB,那泄漏掉的并没有被找回来。 造成这种问题的原因无非两个: 1、kernel的内存管理有问题 2、PHP的问题 按照你们的说法,PHP再有问题,只要被关闭,内存也会被吐回来,但是现在根本就不是这种现象,因此结论就是Kernel的问题。 但我不同意这样的看法,理由有四: 1、这个kernel久经考验,我google过了,也咨询过了,从未报过kernel有这种问题。 2、我换了两个版本的Linux,两个不同小版本号的Kernel,结果全部都是内存泄漏,只不过泄漏速度稍有不同。没有可能最著名的两大商业Linux厂商Redhat和SuSE都有Kernel内存管理问题吧?那他们还混的下去? 3、如果是kernel内存管理问题,为什么同样的方式来跑,PHP就泄漏,ruby就不泄漏?(Java程序也不泄漏) 4、在用户进程运行过程中,用户进程不停向kernel申请更多的内存,但是却从来不回吐内存,同时用户进程自己的resident内存却一丁点都不增加! 这分明是用户进程自己的内存管理出问题的迹象,而不可能是kernel的问题。kernel只负责分配内存给用户进程,回收用户进程吐出来的内存。如果用户进程自己光吃不吐,你能说是kernel的问题? |
|
返回顶楼 | |
发表时间:2006-09-28
3、如果是kernel内存管理问题,为什么同样的方式来跑,PHP就泄漏,ruby就不泄漏?(Java程序也不泄漏)
我不知道ruby是不是来一个请求就开一个进程,如果不是,这可能就是区别。 4、在用户进程运行过程中,用户进程不停向kernel申请更多的内存,但是却从来不回吐内存,同时用户进程自己的resident内存却一丁点都不增加!这分明是用户进程自己的内存管理出问题的迹象,而不可能是kernel的问题。kernel只负责分配内存给用户进程,回收用户进程吐出来的内存。如果用户进程自己光吃不吐,你能说是kernel的问题? free只是读/proc/mem内容,top是怎么统计出来的我不清楚,在一般情况下二者应该大致一致,为什么会出现不一致我说不清楚。 用户进程光吃不吐自然用户进程毛病,但进程关掉后还没吐出来是内核毛病。 |
|
返回顶楼 | |
发表时间:2006-09-28
ddd 写道 3、如果是kernel内存管理问题,为什么同样的方式来跑,PHP就泄漏,ruby就不泄漏?(Java程序也不泄漏)
我不知道ruby是不是来一个请求就开一个进程,如果不是,这可能就是区别。 4、在用户进程运行过程中,用户进程不停向kernel申请更多的内存,但是却从来不回吐内存,同时用户进程自己的resident内存却一丁点都不增加!这分明是用户进程自己的内存管理出问题的迹象,而不可能是kernel的问题。kernel只负责分配内存给用户进程,回收用户进程吐出来的内存。如果用户进程自己光吃不吐,你能说是kernel的问题? free只是读/proc/mem内容,top是怎么统计出来的我不清楚,在一般情况下二者应该大致一致,为什么会出现不一致我说不清楚。 用户进程光吃不吐自然用户进程毛病,但进程关掉后还没吐出来是内核毛病。 PHP两种运行方式我都试过了,一种方式是apache的mod_php方式,这种方式和运行ruby不一样,另外一种是用fastcgi方式跑PHP,这种方式和用fastcgi跑ruby的方式是完全一致的。但是无论如何PHP它就是泄漏,ruby就是不泄漏。这种证据让我无法怀疑是kernel的问题。 那用户进程光吃不吐,同时用户自己的resident还不增加,难道你不觉得蹊跷?进程吃进去的内存它弄到哪里去了? |
|
返回顶楼 | |
发表时间:2006-09-28
你这个机器出现的问题蹊跷的地方不是一个两个,我搞不懂原因具体是什么,只是划分一下责任而已。
|
|
返回顶楼 | |
发表时间:2006-09-28
>我也没有说过PHP内存泄漏造成服务器变慢,事实上速度一点都不慢。
那你为什么晚上要重新启动机器?好奇,仅仅是好奇 |
|
返回顶楼 | |
发表时间:2006-09-28
robbin 写道 那用户进程光吃不吐,同时用户自己的resident还不增加,难道你不觉得蹊跷?进程吃进去的内存它弄到哪里去了? resident内存不增加正常啊 分配的是VM的内存,resident指的是实际占用的物理内存。 引用 RES is resident memory usage, i.e. what's actually in the memory. In a way it could be probably used for measuring real memory usage of the app - if the app requests 100M memory from the kernel but actually uses only 1M, this should increase only by 1M. There are only two small problems, a) RES doesn't include memory that's swapped out (and no, the SWAP field in 'top' is not usable, it's completely bogus), b) some of that memory may be shared. |
|
返回顶楼 | |
发表时间:2006-09-28
ddd 写道 >我也没有说过PHP内存泄漏造成服务器变慢,事实上速度一点都不慢。
那你为什么晚上要重新启动机器?好奇,仅仅是好奇 要不重起,第二天物理内存用光了怎么办?能肯定网站都访问不了哇。 |
|
返回顶楼 | |