内存地址分为物理地址和虚拟地址:它们之间存在转换的关系。
x86最多支持4GiB内存。
x86_64系统最多支持1Tib的内存。但redhat的系统只支持256GiB的内存。
X86支持的内存地址空间的计算方法为
2^32
4294967296 Bytes
2^32/1024/1024/1024 KiB MiB GiB
4
那么64位操作系统理论因该为
2^64/1024/1024/1024
17179869184 GiB
但是我们说他只支持1TiB的内存寻址空间呢?
因为我们64位系统并没有用到64位寻址。
只用到了40位寻址空间
2^40/1024/1024/1024
1024
而红帽只支持38位
2^38/1024/1024/1024
256
查看本机内存大小:
[linscora@linscora ~]$ /usr/bin/sudo /bin/grep Memory /var/log/messages
口令:
Mar 28 14:54:23 linscora kernel: Memory for crash kernel (0x0 to 0x0) notwithin permissible range
Mar 28 14:54:23 linscora kernel: Memory: 1550440k/1572224k available (2154k kernel code, 20432k reserved, 899k data, 232k init, 654720k highmem)
Mar 28 14:54:24 linscora kernel: pcmcia: parent PCI bridge Memory window: 0xc0200000 - 0xcfffffff
Mar 28 14:54:24 linscora kernel: pcmcia: parent PCI bridge Memory window: 0xe8000000 - 0xefffffff
Mar 28 14:54:24 linscora kernel: pcmcia: parent PCI bridge Memory window: 0xc0200000 - 0xcfffffff
Mar 28 14:54:24 linscora kernel: pcmcia: parent PCI bridge Memory window: 0xe8000000 - 0xefffffff
Swap 我们的系统都会为一个swap分区,它是当我们的内存不足的时候。把数据给Swap处理。还有一种情况就是我们系统内存中长期不调用或数据内容不变的数据也放在swap中。减少内存的占用。
虚拟地址空间:虚拟地址空间它并不是虚拟内存。它是一个不存在的东西。没有任何实际意义。在32位的操作系统为每一个进程都分配了一个4GiB的虚拟地址空间
物理地址空间: 包括物理内存和虚拟内存
1、虚拟地址(就是4GiB的虚拟地址空间)必须转换成物理页桢
2、它是通过硬件上的内存管理单元来完成的。
3、物理页可能是不连续的。程序申请的虚拟内存是连续的,但是映射的时候可能并不是连续的。
4、物理内存可是RAM或者是swap,物理内存跟虚拟内存是一一对应的关系。
加注:32位的cpu说明该cpu的寄存器是32位,数据总线是32位,虚拟地址空间是32位,而其可寻址的物理地址的地址空间却不一定是32位,这取决于cpu的引脚上有多少条地址线,也取决于这些地址线连接了多大的内存。MUU > Memory ManagerMent Unit.是负责映射虚拟地址和物理地址的。
查看进程耗用的物理地址空间:
[linscora@linscora ~]$ /usr/bin/sudo /bin/cat /proc/1/status
口令:
Name: init
State: S (sleeping)
SleepAVG: 98%
Tgid: 1
Pid: 1
PPid: 0
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 2076 kB 这个进程在峰值的时候用了2076个KiB的物理内存
VmSize: 2072 kB 这个进程当现的使用数大小
VmLck: 0 kB
VmHWM: 652 kB
VmRSS: 652 kB 真实内存
VmData: 196 kB 数据区耗用的内存
VmStk: 84 kB
VmExe: 32 kB
VmLib: 1712 kB
VmPTE: 24 kB
StaBrk: 08dce000 kB
Brk: 08def000 kB
StaStk: bf97f6d0 kB
ExecLim: 08050000
Threads: 1
SigQ: 1/24566
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
CapInh: 0000000000000000
CapPrm: 00000000ffffffff
CapEff: 00000000fffffeff
Cpus_allowed: 00000001
Mems_allowed: 1
这个进程的总共使用内存是用pmap来查:
[linscora@linscora proc]$ /usr/bin/pmap 4097
4097: /usr/lib/scim-1.0/scim-launcher -d -c simple -e all -f socket --no-stay
00110000 64K r-x-- /usr/lib/libchewing.so.3.0.0
00120000 20K rwx-- /usr/lib/libchewing.so.3.0.0
00125000 3100K rwx-- [ anon ]
0042c000 12K r-x-- /usr/lib/gconv/EUC-CN.so
0042f000 8K rwx-- /usr/lib/gconv/EUC-CN.so
00431000 64K r-x-- /usr/lib/gconv/libGB.so
00441000 8K rwx-- /usr/lib/gconv/libGB.so
00448000 36K r-x-- /lib/libnss_files-2.5.so
00451000 4K r-x-- /lib/libnss_files-2.5.so
00452000 4K rwx-- /lib/libnss_files-2.5.so
00453000 96K r-x-- /usr/lib/scim-1.0/IMEngine/chinese-standard-im.so
0046b000 4K rwx-- /usr/lib/scim-1.0/IMEngine/chinese-standard-im.so
0046c000 472K r-x-- /usr/lib/scim-1.0/1.4.0/IMEngine/pinyin.so
004e2000 8K rwx-- /usr/lib/scim-1.0/1.4.0/IMEngine/pinyin.so
004e4000 296K r-x-- /usr/lib/scim-1.0/1.4.0/IMEngine/table.so
0052e000 4K rwx-- /usr/lib/scim-1.0/1.4.0/IMEngine/table.so
0052f000 84K r-x-- /usr/lib/scim-1.0/1.4.0/FrontEnd/socket.so
00544000 4K rwx-- /usr/lib/scim-1.0/1.4.0/FrontEnd/socket.so
0072d000 60K r-x-- /usr/lib/scim-1.0/1.4.0/IMEngine/chewing.so
0073c000 4K rwx-- /usr/lib/scim-1.0/1.4.0/IMEngine/chewing.so
00822000 40K r-x-- /usr/lib/scim-1.0/1.4.0/Config/simple.so
0082c000 4K rwx-- /usr/lib/scim-1.0/1.4.0/Config/simple.so
009bb000 104K r-x-- /lib/ld-2.5.so
009d5000 4K r-x-- /lib/ld-2.5.so
009d6000 4K rwx-- /lib/ld-2.5.so
009d9000 1276K r-x-- /lib/libc-2.5.so
00b18000 4K --x-- /lib/libc-2.5.so
00b19000 8K r-x-- /lib/libc-2.5.so
00b1b000 4K rwx-- /lib/libc-2.5.so
00b1c000 12K rwx-- [ anon ]
00b21000 8K r-x-- /lib/libdl-2.5.so
00b23000 4K r-x-- /lib/libdl-2.5.so
00b24000 4K rwx-- /lib/libdl-2.5.so
00b27000 148K r-x-- /lib/libm-2.5.so
00b4c000 4K r-x-- /lib/libm-2.5.so
00b4d000 4K rwx-- /lib/libm-2.5.so
00b7e000 44K r-x-- /lib/libgcc_s-4.1.2-20080825.so.1
00b89000 4K rwx-- /lib/libgcc_s-4.1.2-20080825.so.1
00c4d000 4K r-x-- [ anon ]
00cb0000 852K r-x-- /usr/lib/libscim-1.0.so.8.1.0
00d85000 56K rwx-- /usr/lib/libscim-1.0.so.8.1.0
00d93000 4K rwx-- [ anon ]
0300d000 896K r-x-- /usr/lib/libstdc++.so.6.0.8
030ed000 16K r-x-- /usr/lib/libstdc++.so.6.0.8
030f1000 4K rwx-- /usr/lib/libstdc++.so.6.0.8
030f2000 24K rwx-- [ anon ]
08048000 16K r-x-- /usr/lib/scim-1.0/scim-launcher
0804c000 8K rw--- /usr/lib/scim-1.0/scim-launcher
080f3000 3404K rw--- [ anon ]
b6eba000 516K rw--- [ anon ]
b6f9d000 1056K rw--- /usr/share/scim/tables/Wubi.bin
b70a5000 3528K rw--- [ anon ]
b7479000 16K r---- /usr/share/locale/zh_CN/LC_MESSAGES/scim-tables.mo
b747d000 1056K r---- /usr/lib/locale/locale-archive
b7585000 1032K rw--- [ anon ]
b76a8000 900K r---- /usr/lib/locale/locale-archive
b7789000 232K r---- /usr/lib/locale/zh_CN/LC_CTYPE
b77c3000 8K r---- /usr/lib/locale/locale-archive
b77c5000 8K r---- /usr/lib/locale/locale-archive
b77c7000 1092K r---- /usr/lib/locale/locale-archive
b78d8000 16K r---- /usr/share/locale/zh_CN/LC_MESSAGES/scim-pinyin.mo
b78dc000 28K r--s- /usr/lib/gconv/gconv-modules.cache
b78e3000 4K r---- /usr/lib/locale/locale-archive
b78e4000 620K r---- /usr/lib/locale/locale-archive
b797f000 4K r---- /usr/lib/locale/locale-archive
b7980000 1044K r---- /usr/lib/locale/locale-archive
b7a85000 4K r---- /usr/lib/locale/locale-archive
b7a86000 944K r---- /usr/lib/locale/locale-archive
b7b72000 4K r---- /usr/lib/locale/locale-archive
b7b73000 816K r---- /usr/lib/locale/locale-archive
b7c3f000 1048K r---- /usr/lib/locale/locale-archive
b7d45000 4K r---- /usr/lib/locale/locale-archive
b7d46000 72K r---- /usr/share/locale/zh_CN/LC_MESSAGES/libc.mo
b7d58000 244K r---- /usr/lib/locale/locale-archive
b7d95000 2048K r---- /usr/lib/locale/locale-archive
b7f95000 12K rw--- [ anon ]
b7fa6000 20K r---- /usr/share/locale/zh_CN/LC_MESSAGES/scim.mo
bf96f000 84K rw--- [ stack ]
total 27776K
[linscora@linscora ~]$ /usr/bin/sudo /bin/cat /proc/1/statm
518 163 139 8 0 70 0
[linscora@linscora proc]$ /usr/bin/sudo /usr/bin/yum install glibc-utils
口令:
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
rpmforge | 1.1 kB 00:00
Setting up Install Process
Package glibc-utils-2.5-42.i386 already installed and latest version
[linscora@linscora proc]$ /usr/bin/memusage /bin/ls
1 2568 3376 3640 4049 4140 7437 interrupts scsi
10 2585 3386 3641 4050 4142 7451 iomem self
109 2594 3399 3711 4097 415 7452 ioports slabinfo
11 2597 3400 3716 4102 4150 777 irq stat
112 2617 3408 3717 4103 4231 acpi kallsyms swaps
114 2643 3421 3718 4105 452 asound kcore sys
171 2649 3429 3719 4107 5 buddyinfo keys sysrq-trigger
172 2673 3432 3720 4110 6 bus key-users sysvipc
173 2741 3462 3721 4112 6156 cmdline kmsg tty
174 3 3487 3722 4114 6157 cpuinfo loadavg uptime
1902 322 3507 373 4119 6190 crypto locks version
1903 324 3516 3823 4121 6191 devices mdstat vmcore
1928 3257 3530 3825 4122 6258 diskstats meminfo vmnet
1936 3262 3539 3828 4124 6675 dma misc vmstat
1938 3266 3548 384 4126 6676 driver modules zoneinfo
1946 3283 358 3963 4129 7 execdomains mounts
2 3293 3581 3965 4130 7342 fb mtrr
2100 3329 359 3977 4132 7380 filesystems net
2176 334 3598 4 4137 7408 fs partitions
2566 3341 364 4016 4139 7421 ide schedstat
Memory usage summary: heap total: 72489, heap peak: 62289, stack peak: 9696
total calls total memory failed calls
malloc| 256 59377 0
realloc| 8 13112 0 (nomove:6, dec:6, free:0)
calloc| 0 0 0
free| 28 41020
Histogram for block sizes:
0-15 195 73% ==================================================
16-31 8 3% ==
32-47 9 3% ==
48-63 14 5% ===
64-79 1 <1%
80-95 1 <1%
96-111 21 7% =====
112-127 2 <1%
208-223 1 <1%
304-319 1 <1%
352-367 3 1%
384-399 1 <1%
480-495 1 <1%
1392-1407 1 <1%
1520-1535 1 <1%
4096-4111 1 <1%
12800-12815 1 <1%
25600-25615 1 <1%
32784-32799 1 <1%
在/etc/security/limits.conf调整用户使用的内存空间大小。这个功能它是由pam_limits.so提供的。
****user1不能运行pro1,user1运行pro2提示警告信息****
1、[root@linscora ~]# /bin/cat /etc/security/limits.conf |grep user1
user1 hard as 1000
[root@linscora ~]# /bin/su - user1
-bash: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory
2、[root@linscora ~]# /bin/cat /etc/security/limits.conf |grep user1
user1 hard as 100
[root@linscora ~]# /bin/su - user1
[root@linscora ~]# 登录不进出,而且连提示都没有,上面还有提示。说明100KiB的内存连提示都不够。
3、[root@linscora ~]# /bin/cat /etc/security/limits.conf |grep user1
user1 soft as 5000 一个应用程序的最大的峰值
user1 hard as 6000 全部程序程序不能超过5000KiB
[root@linscora ~]# /bin/su - user1
[user1@linscora ~]$ dd if=/dev/zero of=hello bs=1M count=5
段错误
[user1@linscora ~]$
[user1@linscora ~]$ dd if=/dev/zero of=he bs=1M count=1
dd: 内存用尽
[user1@linscora ~]$ dd if=/dev/zero of=he bs=1k count=10
10+0 records in
10+0 records out
10240 bytes (10 kB) copied, 0.000226286 seconds, 45.3 MB/s
[user1@linscora ~]$ ulimit -a #查看自己用户能使用系统内存的多少,而且可以手动调节用户自己的soft限制数。
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 24566
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 24566
virtual memory (kbytes, -v) 5000 ######### user1 soft as 5000
file locks (-x) unlimited
而且可以手动调节用户自己的soft限制数。
[root@linscora ~]# ulimit -v 4000
[root@linscora ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 24566
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 24566
virtual memory (kbytes, -v) 4000
file locks (-x) unlimited
物理地址空间:
内存的最小单位是页,一个页面数在32位系统中为4KiB
TLB: Translation lookaside buffer,即旁路转换缓冲,或称为页表缓冲;里面存放的是一些页表文件(虚拟地址到物理地址的转换表)
对于虚拟地址叫page(页面);对于物理地址叫frame(页框)
[root@linscora ~]# /usr/sbin/x86info -c
x86info v1.20. Dave Jones 2001-2006
Feedback to .
Found 1 CPU
--------------------------------------------------------------------------
Family: 6 Model: 9 Stepping: 5 Type: 0 Brand: 6
CPU Model: Pentium M (Banias) Original OEM
Processor name string: Intel(R) Pentium(R) M processor 1700MHz
Feature flags:
fpu vme de pse tsc msr mce cx8 sep mtrr pge mca cmov pat clflsh ds acpi mmx fxsr sse sse2 tm pbe est tm2
Extended feature flags:
Cache info
L1 Instruction cache: 32KB, 8-way associative. 64 byte line size.
L1 Data cache: 32KB, 8-way associative. 64 byte line size.
L2 unified cache: 1MB, 8-way associative. 64 byte line size.
TLB info
Instruction TLB: 4K pages, 4-way associative, 128 entries. ## 用来缓存一般页表的指令页表缓存
Instruction TLB: 4MB pages, fully associative, 2 entries ## 用来缓存大尺寸页表的指令页表缓存
Data TLB: 4K pages, 4-way associative, 128 entries. ## 用来缓存一般页表的数据页表缓存
Data TLB: 4MB pages, 4-way associative, 8 entries ## 用来缓存大尺寸页表的数据页表缓存
提升内存的性能:
SRAM 保持数据不更新。
DRAM 每隔一段时间会刷新数据。
在64位系统中。没有高位内存这一说。所有的高位内存都为0。这样可以减少MMU的访问数据,减少CPU的访问时间。
提高TLB的性能:
就是提高TLB的大小。首先查看大TLB的大小。
[root@linscora ~]# /bin/cat /proc/meminfo |grep -i hugepagesize
Hugepagesize: 4096 kB
[root@linscora ~]# sysctl -a |grep hugepage
vm.nr_hugepages = 0
[root@linscora ~]# /usr/bin/vim /etc/sysctl.conf
[root@linscora ~]# sysctl -w vm.nr_hugepages=20 ##单位为个数,/usr/sbin/x86info -c查看到每个大页的大小为4MiB。所以这里大页就为80MiB。
vm.nr_hugepages = 20
[root@linscora ~]# sysctl -p
[root@linscora ~]# sysctl -a |grep hugepa
vm.nr_hugepages = 20
把一个文件系统挂载成大页的形式,因为有的应用程序可能不读到这个内核参数。所以在这个应用程序访问这个目录的时候。就开启了大页的功能。
root@linscora ~]# /bin/mkdir /my-hugepages
[root@linscora ~]# mount -t hugetlbfs none /my-hugepages/
查看系统调用数据情况:
[root@linscora ~]# /usr/bin/strace elinks -dump
调整内存在半虚拟化动态的范围:在xen的配置文件里可调。
阅读(1299) | 评论(1) | 转发(2) |