标签 内存 下的文章

ORA-27102: out of memory 故障处理

ORA-27102: out of memory一般发生在服务器系统配置变更以后,oracle在启动的时候报错,

SQL> startup
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device

系统实际可用内存还剩几十个GB,这个问题在linux到64位中比较常见,当SGA的值大于共享内存就会报这个错;
解决方法:
--MetaLink上给出了关于这个问题的描述 [ID 301830.1]
--是由于kernel.shmall值设置太小引起的

kernel.shmall
  该参数用于配置系统一次能够使用的最大的共享页面数,该参数的值总是ceil(shmmax/PAGE_SIZE)
Oracle 9i,10g,11g的x86以及x86-64平台推荐以及缺省的大小通常为2097152
在大多数情况下,该参数是够用的。按照上述计算方式页面内存总大小可以达到8GB(2097152*4096 bytes (shmall*PAGE_SIZE))

  通常情况下,PAGE_SIZE 的大小为4096byte,除非使用了Big Pages 或 Huge Pages
对于超出8GB系统内存,如共享内存段(shmmax)的最大大小是16G,则所需要共享内存页数(shmall)为16GB/4KB=16777216KB/4KB=4194304(页)

  共享内存在shmall这个参数中设置,shmall单位为页,换算成内存大小还需要把两个值相乘,如shmall=8388608,那么共享内存的大小就是(8388608*4096)/(1024*1024*1024)=32G
其他依次类推;



---阅读剩余部分---

WINDOWS SERVER 2008/R2/2012最大内存支持及版本升级方法

Windows Server 2008 最大内存限制:

Windows Server 2008 x86
Windows Server 2008 标准版,支持最大 4GB 内存
Windows Server 2008 企业版,支持最大 64GB 内存
Windows Server 2008 数据中心版,支持最大 64GB 内存

Windows Server 2008 x64 with 或 without Hyper-V Role Enable
Windows Server 2008 标准版,支持最大 32GB 内存
Windows Server 2008 企业版,支持最大 1TB 内存
Windows Server 2008 数据中心版,支持最大 1TB 内存

Windows Server2008 R2 最大内存限制:
Windows Server 2008 R2 with Hyper-V Role Enable
Windows Server 2008 R2 标准版,最大支持 32GB 内存
Windows Server 2008 R2 企业版,最大支持 1TB 内存
Windows Server 2008 R2 数据中心版,最大支持 1TB 内存
Windows Server 2008 R2 without Hyper-V Role Enable
Windows Server 2008 R2 标准版,最大支持 32GB 内存
Windows Server 2008 R2 企业版,最大支持 2TB 内存
Windows Server 2008 R2 数据中心版,最大支持 2TB 内存

Windows Server 2012 Standard
Windows Server 2012 Datacenter

Windows Server 2012支持以下最大的硬件规格
64个物理处理器
640个逻辑处理器(关闭Hyper-V,打开就支持320个)
4TB内存

2008R2标准版操作系统升级到企业版。不想重装系统只能用升级命令是DISM.exe。需在线升级。

升级步骤:  

第一步:停用此台服务器上所有正在运行的应用程序,把应用程序服务由自动改为手动 。 

第二步:获取当前操作系统版本信息,dism /online /Get-CurrentEdition

第三步:检查当前操作系统可升级的版本  dism/online /Get-TargetEditions

第四步:输入操作系统升级命令,目标版本和序列号。安装完成后第1次重启系统  

dism /online /Set-Edition:ServerEnterprise/productkey:XXXXX XXXXX - XXXXX - XXXXX - XXXXX

第一个参数是edition ID, 也就是第二步中查询到的目标版本; 第二个参数是ProductKey,25个字符的目标系统版本的产品密钥。

第五步:系统重新启后进行版本升级的系统配置,当配置完成后第2次重启系统。

第六步:第2次重启完成后,登录操作检查操作系统的版本、系统激活状态。

如果开始出现了一次语法错误报87,又出现了产品密钥不符报1605,总之这个密钥一定要对。待到成功后会提示重启,一共是两次重启吧,最终Windows Server 2008 R2 标准版升级到企业版大功告成,系统登陆时就能看到的。

设置SQL Server最大内存使用量

SQLServer2008版本默认安装以后内存最大使用量为2147483647,基本会把系统内存耗尽,查看当前内存使用情况:

SELECT 
  physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB, 
    large_page_allocations_kb/1024 AS sql_large_page_allocations_MB, 
    locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB, 
    virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB, 
    virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
    page_fault_count AS sql_page_fault_count,
    memory_utilization_percentage AS sql_memory_utilization_percentage, 
    process_physical_memory_low AS sql_process_physical_memory_low, 
    process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;  

SQL.png
设置当前最大内存使用量为16G

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 16384;  
GO  
RECONFIGURE;  
GO

直接在SQL查询器里面执行即可,一般根据系统内存大小设置,至少保留2--3G内存给操作系统使用;
参考:https://docs.microsoft.com/zh-cn/sql/database-engine/configure-windows/server-memory-server-configuration-options?view=sql-server-2017
也可以在登陆SQLServer以后,右键服务器属性--内存,选择使用AWE分配内存、最小服务器内存、最大服务器内存等参数,如下图,最后确定即可;
memery.png

Linux设置HugePages操作记录

当大量内存用于 Oracle 数据库时,操作系统将消耗大量资源来管理虚拟地址到物理地址转换,其结果往往是一个非常大的页表结构。由于每条页表条目包含进程正在使用的所有内存页面的虚拟地址到物理地址的转换,因此对于非常大的系统全局区 (SGA),每个进程的页表条目都可能很大。例如,使用 8 GB 内存的 Oracle 数据库进程的页表条目将达 8 GB/4 KB(即 2097152 条记录或页面)。如果有 100 个 Oracle 数据库会话/进程,则将页面数乘以 100。您可以看到,要管理的页面数量巨大。

通过在 Linux 中启用 HugePages,可以通过增大页面大小来减少 TLB 条目数。对于 Linux,HugePages 大小为 2 MB。通过为 Oracle 数据库 SGA 选用更大的页面,可大大减少要管理的页面数。

注:启用 HugePages 可显著提升性能。

透明 HugePages 和 Oracle 数据库

最近,RHEL 6、Oracle Linux 6 和 SUSE Linux Enterprise Server 11 中引入了一个新特性 — 透明 HugePages。透明 HugePages 旨在自动、动态地利用 HugePages。遗憾的是,目前透明 HugePages 与传统 HugePages 联用会出现一些问题,导致性能问题和系统重启。在 My Oracle Support 说明 1557478.11557478.1 中,Oracle 建议不要同时使用透明 HugePages 和 Oracle 数据库。
注:在 Oracle Linux 6.5 版中,已删除透明 HugePages。

验证是否已对 Oracle 数据库实例启用大页面

可以通过检查警报日志来验证是否对数据库实例启用了大页面。启动实例时,您应在警报日志中参数列表前面看到如下内容:

Large Pages Information *
Total Shared Global Region in Large Pages = 28 GB (100%)
Large Pages used by this instance: 14497 (28 GB)
Large Pages unused system wide = 1015 (2030 MB) (alloc incr 64 MB)
Large Pages configured system wide = 19680 (38 GB)
Large Page size = 2048 KB
参考http://www.oracle.com/technetwork/cn/articles/servers-storage-dev/hugepages-2099009-zhs.html

Linux设置HugePages操作记录步骤如下:

1、查看当前系统是否配值HugePages

下面的查询中HugePages相关的几个值都为0,表明当前未配值HugePages,其次可以看到Hugepagesize为2MB。

[root@hch_test_pd_121_217 ~]$grep Huge /proc/meminfo
AnonHugePages:   5787648 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

2、修改用户的memlock限制

通过修改/etc/security/limits.conf 配值文件来实现
该参数的值通常配值位略小于当前的已安装系统内存,如当前你的系统内存为64GB,可以做如下设置

  • soft memlock 60397977
  • hard memlock 60397977
    上述的设置单位为kb,不会降低系统性能。至少也要配值为略大于系统上所有SGA的总和。

使用ulimit -l 来校验该设置

3、禁用AMM(oracle 11g)

如果当前的Oracle 版本为10g,可以跳过此步骤。
如果当前的Oracle 版本为11g,由于AMM(Automatic Memory Management)特性与Hugepages不兼容,需要禁用AMM:

    ALTER SYSTEM RESET memory_target SCOPE=SPFILE;
    ALTER SYSTEM RESET memory_max_target SCOPE=SPFILE;
    ALTER SYSTEM SET sga_target=<n>g SCOPE=SPFILE;
    ALTER SYSTEM SET pga_aggregate_target=<n>g SCOPE=SPFILE;
    SHUTDOWN IMMEDIATE; 
    STARTUP;

4、计算vm.nr_hugepages 的值

使用Oracle 提供的脚本hugepages_settings.sh的脚本来计算vm.nr_hugepages的值
在执行脚本之前确保所有的Oracle 实例已启动以及ASM也启动(存在的情形下)
sh hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 14467
手工计算:
nr_hugepages>=SGA_Target/Hugepagesize
=16G*1024M/2M
=4608

vim /etc/sysctl.conf 来设置vm.nr_hugepages参数

vm.nr_hugepages = 1496  
sysctl -p     #执行生效

5、停止所有的Instance并重启server

上述的所有步骤已经实现了动态修改,但对于HugePages的分配需要重新启动server才能生效。

6、验证配值

HugePages相关参数的值会随着当前服务器上的实例的停止与启动而动态发生变化
通常情况下,HugePages_Free的值应当小于HugePages_Total的值,在HugePages被使用时HugePages_Rsvd值应当为非零值。

 [root@c69160 ~]$ grep Huge /proc/meminfo
  HugePages_Total:   131
  HugePages_Free:     20
  HugePages_Rsvd:     20
  Hugepagesize:     2048 kB 
 如下面的情形,当服务器上仅有的一个实例被关闭后,HugePages_Rsvd的值为零。且HugePages_Free等于HugePages_Total
  $ grep Huge /proc/meminfo
  HugePages_Total:   131
  HugePages_Free:    131
  HugePages_Rsvd:      0
  Hugepagesize:     2048 kB   

#### 下面的三种情形应当重新配置HugePages
    1、物理内存的增减或减少
    2、在当前服务器上新增或移出Instance
    3、Instance的SGA大小增加或减少   
#### 如果未能调整HugePages,可能会引发下面的问题
    1、数据库性能地下
    2、出现内存不足或者过度使用交换空间
    3、数据库实例不能被启动

Hugepages参数说明及使用注意事项

Hugepages是从Linux kernal 2.6后被引入的,其目的是使用更大的memory page size以适应越来越大的系统内存,使用hugepage可以用更大的内存页来取代传统的4K页面。

page table

page table是操作系统上的虚拟内存系统的数据结构模型,用于存储虚拟地址与物理地址的对应关系。
当我们访问内存时,首先访问page table,然后Linux在通过page table的mapping来访问真实物理内存(ram+swap)

TLB

A Translation Lookaside Buffer (TLB)
TLB是在cpu中分配的一个固定大小的buffer(or cache),用于保存page table的部分内容,使CPU更快的访问并进行地址转换。

hugetlb

hugetlb 是记录在TLB 中的条目并指向Hugepages。

hugetlbfs

这是一个新的基于2.6 kernel之上的内存文件系统,如同tmpfs。
在TLB中通过hugetlb来指向hugepage。这些被分配的hugepage作为内存文件系统hugetlbfs(类似tmpfs)提供给进程使用。

HugePage主要带来以下好处:

1、HugePages 会在系统启动时,直接分配并保留对应大小的内存区域。
2、HugePages 在开机之后,如果没有管理员的介入,是不会释放和改变的。
3、没有swap。
Notswappable: HugePages are not swappable. Therefore thereis no page-in/page-outmechanism overhead.HugePages are universally regarded aspinned.







---阅读剩余部分---

Oracle实例启动时报ORA-00845的解决方法

startup启动数据库的时候报错:
ORA-00845: MEMORY_TARGET not supported on this system
在Oracle 11g中如果采用AMM内存管理,那么当MEMORY_TARGET的值大于/dev/shm的时候,就会报ORA-00845: MEMORY_TARGET not supported on this system错误,解决办法增加/dev/shm大小,在redhat系列系统中,/dev/shm的默认值是系统总内存的一半

1、修改/dev/shm大小

df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             140G   57G   76G  43% /
/dev/sda1              99M   12M   82M  13% /boot
tmpfs                 3.9G  995M  3.0G  25% /dev/shm
mount -o size=8G -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm


---阅读剩余部分---

This is a prerequisite condition to test whether sufficient total swap space is available on the system解决方法

安装oracle的时候swap空间设置太小,会报This is a prerequisite condition to test whether sufficient total swap space is available on the system. (more details)
Expected Value
: 15.64GB (1.6403472E7KB) 16400000
Actual Value
: 4.87GB (5111800.0KB)
类似于上面的错误,
原因是swap空间设置太小,比如内存是8G设置swap为4G就会出现这个报错,解决办法扩展swap空间即可:
方法如下:
使用dd命令创建一个4G大小的swap分区
dd if=/dev/zero of=/data/swap bs=1M count=4096

格式化刚才创建的分区
mkswap /data/swap

再使用swapon命令把这个文件分区变成swap分区
swapon /data/swap

关闭SWAP分区的命令为:swapoff /data/swap

再用free -m 查看已经扩容的了swap分区。

让swap自动挂载,需要修改etc/fstab文件, vi /etc/fstab
在文件末尾加上 /data/swap swap swap default 0 0即可。

查看Tomcat内存实际占用

  使用ps -ef | grep port 查找出具体tomcat的pid,然后使用 jmap -heap pid就可以看出整个对内存的使用情况了:

[tomcat@hch_test_web_1_24 home]$ jmap -heap 23710
Attaching to process ID 23710, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03

using thread-local object allocation.
Parallel GC with 18 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 536870912 (512.0MB)
   MaxPermSize      = 2147483648 (2048.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 535298048 (510.5MB)
   used     = 309708648 (295.3611831665039MB)
   free     = 225589400 (215.1388168334961MB)
   57.857234704506155% used
From Space:
   capacity = 89128960 (85.0MB)
   used     = 19648888 (18.73863983154297MB)
   free     = 69480072 (66.26136016845703MB)
   22.04545862534467% used
To Space:
   capacity = 85458944 (81.5MB)
   used     = 0 (0.0MB)
   free     = 85458944 (81.5MB)
   0.0% used
PS Old Generation
   capacity = 1431830528 (1365.5MB)
   used     = 311125312 (296.71221923828125MB)
   free     = 1120705216 (1068.7877807617188MB)
   21.729199504817373% used
PS Perm Generation
   capacity = 536870912 (512.0MB)
   used     = 212898400 (203.03573608398438MB)
   free     = 323972512 (308.9642639160156MB)
   39.6554172039032% used

34822 interned Strings occupying 3865248 bytes.

Tomcat内存参数设置

要添加在tomcat 的bin 下catalina.sh文件中,找到cygwin=false,在这一行的前面加入参数,具体如下# vi TOMCAT_HOME/bin/catalina.sh(默认文件内容)

export JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
export JAVA_OPTS="-server -Xms512m -Xmx1024m -Xss256k -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"

例如:
/bin/catalina.sh

JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:PermSize=128m  -XX:MaxPermSize=256m -XX:SurvivorRatio=14 -XX:+UseParallelOldGC"

jvm参数说明:


---阅读剩余部分---

Linux手动创建Swap交换分区及Swap说明

Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 Swap 分区中,等到那些程序要运行时,再从 Swap 分区中恢复保存的数据到内存中;一种是将文件作为 Swap 分区,一种是将分区作为 Swap 分区,将分区作为 Swap 分区相比于文件更优。

RHEL 6.8 的建议如下,当然还是需要根据实际情况进行适当调整:

---阅读剩余部分---

笔记本/PC升级注意的问题

之前都是说内存大了就很快,但现在基本没卵用,PC笔记本内存基本>=8G以后再提升作用就不大了,操作感觉慢的瓶颈主要在IO了,也就是硬盘速度,老的机器硬盘消磨损耗比较,推荐直接换新硬盘,并另加个ssd盘,系统装在上面,速度很看,当然前提是你的主板支持双硬盘、大内存等等,cpu也别太挫···

最新

分类

归档

评论

其它