免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10611 | 回复: 49

[其他] Linux 缺陷大吐槽 [复制链接]

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
发表于 2014-06-30 16:37 |显示全部楼层
本帖最后由 gaojl0728 于 2014-07-01 13:59 编辑

今天终于有空整理下在学习和使用linux内核的过程中发现的缺陷,在我忘掉之前记录下来, 欢迎大家讨论。
记忆力有限, 只记得这么多了。

1. 低端内存和高端内存

Linux 内核的物理内存管理分为低端内存和高端内存,我认为这是最不合理的设计了。
32位linux 内核默认低端内存1G(实际上是896M低端内存+128M其他用途的低端内存,但他们本质上都是低端内存),其他的都是高端内存。
没打开PAE的情况下, 低端内存1G, 高端内存最大3G
打开了PAE的情况下, 低端内存1G, 高端内存最大63G

内核在低端内存和高端内存之间安装了一道闸门, 低端内存可以放水给高端内存, 反之则不行, 这就是问题的根源。

一般情况下内核自己使用这1G的低端内存, 应用程序使用最大63G高端内存,
但问题就在于这1G低端内存是被所有的应用程序共享的,一旦系统的压力增大, 这1G的低端内存就会成为瓶颈。
造成结果就是1G的低端内存都快耗光了,而高端内存虽然还剩余很多很多如60G, 但是内核用不了高端内存最终还是OOM了
而且OOM之后最坏的情况是,内核OOM了会干掉占用虚存最大的进程,干掉的进程释放的是高端内存而不是低端内存, 内核最终进入无休止的OOM

在高端内存不够用的情况下, 应用程序也会从低端内存分配内存(放水),这进一步加剧了低端内存的紧张。

从linux 2.6 最后的几个版本开始 32位内核已经可以调整低端内存的大小, 最大可以到3G, 这个问题已经有所缓解,但是跟最大(64G-3G) = 61G的高端内存相比, 低端内存还是很小,还是会成为瓶颈。

在64位linux内核下,高端内存的概念暂时被隐藏了, 但并不代表没有问题, 几十年之后这个问题还是会浮出水面。

我认为最合理的设计就是拿掉高端内存的概念, 用低端内存来管理所有物理内存,内核和应用程序都从低端内存分配内存, 他们直接没有这堵闸门,自然就不会有瓶颈。

讨论没有考虑DMA16和DMA内存区,但这不影响结论。

【补充:】
后来经过大家讨论发现高端内存并不能完全拿掉, 毕竟32位内核虚拟地址空间有限,最大只能访问4G虚拟地址空间, 这是个硬限制(这个瓶颈无论如何也那不掉的),其他的内存必定还是要分给应用程序的, 拿掉高端内存并不能解决任何问题, 对于大物理内存的服务器, 只能推荐使用64位内核。

2. 内核的PageCache

PageCache 真是个好东西, linux内核的许多现代操作系统所具备的高级特性如 文件缓存,动态库,mmap等等都依赖于PageCache, 我本人也十分推崇这种用简单的概念统一实现复杂特性的方法。
但问题是PageCache毫无节制,如果需要他会一直分配内存直到系统内存耗尽最终OOM,这对于需要长时间运行的服务器简直是致命的。

3. linux 进程的主线程栈可以自动增长, 但是pthread线程的栈就不行,
我也是偶然发现的这个问题,根源在于glibc和内核的MAP_STACK不匹配造成的。但是这种不一致会造成理解上的困难。

4. 还是关于栈, linux 进程的主线程栈能够按需自动增长,却不能自动递减, 造成的问题是一旦在栈上分配了大内存, 这块内存在进程退出之前实际上是不释放的。

5. linux 下进程的加载是内核干的,但是动态库却不是, 动态库的加载是glibc自己做的,我理解不了这样分离到底有什么好处么。
glibc的代码可读性实在是不敢恭维, 所以我也一直不清楚动态库是如何加载的。

6. Linux不支持异步IO, 虽然从2.6开始已经部分支持异步IO,但只是在磁盘IO实现了,socket一直没有实现。
作为一个现代操作系统没有异步IO实在是个很大的遗憾,虽然epoll也是个很不错的选择, 但是理论上速度还是比不过异步IO

评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 感谢分享

查看全部评分

论坛徽章:
0
发表于 2014-06-30 17:22 |显示全部楼层
认为最合理的设计就是拿掉高端内存的概念, 用低端内存来管理所有物理内存,内核和应用程序都从低端内存分配内存, 他们直接没有这堵闸门,自然就不会有瓶颈

都用低端,那内核最大只能用1G的地址了。高于1G的物理地址都没法用 了。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
发表于 2014-06-30 17:24 |显示全部楼层
想请问一下,低端内存和高端内存是不是都是针对内核空间来说的?还是整个内存空间而言的?
个人的理解是针对内核空间的

论坛徽章:
0
发表于 2014-06-30 17:30 |显示全部楼层
回复 3# goingstudy
内核空间。


   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
发表于 2014-06-30 17:39 |显示全部楼层
本帖最后由 goingstudy 于 2014-06-30 17:44 编辑
在64位linux内核下,高端内存的概念暂时被隐藏了, 但并不代表没有问题, 几十年之后这个问题还是会浮出水面。

按我的理解说一下,不知到对不对
64位的话,整个内存空间有4G * 4G = 16 G * G (不知到什么单位),即使内核空间和用户空间对半分的话,内核空间也有
8 G * G,感觉这么大的内核空间近似是无限的,可以直接采样直接映射,高端内存是完全没有必要的,不知道会有什么问题。
32位感觉高端内存还是有必要的,要不然内核无法访问整个内存空间。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
发表于 2014-06-30 17:52 |显示全部楼层
回复 5# goingstudy

    低端内存和高端内存都是对于物理地址来说的概念, 不是虚拟地址, 对于虚拟地址来说只内核空间和用户空间的概念, 千万别穿插搞混了。
    64位下目前内核只支持最大64G物理内存, 全部都是低端内存。对于虚拟空间肯定是4G*4G了。

    至于其他的, 当年比尔盖茨还说640K物理内存就足够了呢, 现在他早就后悔了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-06-30 18:36 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-07-01 09:58 编辑

由于需要区分内核空间和用户空间,必然导致内核空间不能占用整个4G
也就必然导致不同的进程共享同一个内核空间的问题

有一个4G/4G的补丁,可以让内核可直接寻址的范围达到4G,但是影响性能

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-06-30 18:43 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-07-01 09:59 编辑

打开PAE时,内核也只能直接寻址1G,这个是硬件限制造成的






论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-06-30 18:45 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-07-01 10:11 编辑

即使全部采用low memory的方式来映射内存,也还是要区分用户空间和内核空间,仍然逃不开内核空间被各个进程共享的问题

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-06-30 19:14 |显示全部楼层
本帖最后由 arm-linux-gcc 于 2014-07-01 15:00 编辑

pop栈之后,内存不能归坏给内核,这个是因为没有一个适合的时机来触发这件事,因为出栈就只是简单的做一下pop而已,然后就返回到上一级的函数了
这个过程中没有能够触发异常或调用系统调用,所以无法归还给内核
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP