- 论坛徽章:
- 0
|
Solaris使用virtual memory system, 64位连续地址空间, 包括物理内存和硬盘上的虚拟内存,提供简单memory programming model, \r\n\r\n64位virtual memory space与实际物理内存的对应关系,由CPU上的内存控制器MMU管理, 应用无需知道, 允许应用的进程按连续的地址空间编成, 可超过物理内存大小, 一部分在较慢的硬盘上, 所有空闲内存都作为文件的buffer, 改善性能,\r\n\r\n所以,对某个应用的进程来说,其代码段/数据段/堆栈段所分配的virtual memory 可能被影射到物理内存或硬盘上的虚拟内存(swap),就整个机器来说,你所能看到内存和swap都在用,\r\n\r\n其中Swap space用于backing store内存pages, 如内存短缺, 则内存page页被拷贝到硬盘swap上,并释放内存, 传统Unix需要swap对应所有的内存页,即如运行的进程被分配8MB内存, 则需在swap上保留同样大小的内存空间, 尽管内存此时并未短缺,也要占用, 所以实际往往swap设置的是内存的2倍, \r\n\r\n所以不管如何,你得内存和硬盘swap总是在用的,不会出现内存用光,而swap再用的情况,其原则是:\r\n\r\n1. 如空闲内存小于lotsfree(1/64内存大小)时,进程堆栈开始从内存中被page out, 送回硬盘swap, 所占内存被扫描为空内存给其它进程用, 而swap上的空间被占用,而不是被保留,\r\n\r\n2. 如空闲内存继续减小, 扫描空内存的速度加快,从100pages/s(100*8KB/s) 向8192pags/s(64MB/s)的速度变化,\r\n\r\n3. 如空闲内存继续减小到desfree(1/2 lotsfree)时, 运行的进程不光其堆栈被page out, 其程序代码段开始被swap out, 扔回硬盘的swap上, 所占内存被扫描为空内存给其它进程用,\r\n\r\n所以当内存短缺时, 机器会因运行的进程被公平的扔出和读入,逼近底线而越来越慢,而不会内存用光, 具体你的机器的配置可用netstat -k看, 如:\r\n\r\n# netstat -k \r\n...\r\nsystem_pages:\r\nphysmem 63284 nalloc 11786054 nfree 11708436 nalloc_calls 5350 nfree_calls 4502 \r\nkernelbase 268435456 econtig 285212672 freemem 15428 availrmem 55955 lotsfree 977\r\ncachefree 977 desfree 488 minfree 244 fastscan 8192 slowscan 100 nscan 0 \r\ndesscan 25 pp_kernel 6089 pagesfree 15428 pageslocked 6579 pagestotal 62534 \r\n...\r\n\r\n即对一512MB内存的服务器:\r\nlotsfree: 977 pages, ~8MB, 1/64 physical memory\r\nDesfree: 488 pages, ~4MB, \r\nminfree: 244 pages, ~2MB,\n\n[ 本帖最后由 alfee 于 2005-12-30 02:06 编辑 ] |
|