Oracle系统内核参数、资源限制及ipcs相关命令总结

it2025-04-20  3

一、oracle内核参数

Oracle内核参数配置文件在 /etc/sysctl.conf路径下:

vi /etc/sysctl.conf # System default settings live in /usr/lib/sysctl.d/00-system.conf. # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file # # For more information, see sysctl.conf(5) and sysctl.d(5). #ORACLE SETTING kernel.shmmax = 64424509440 kernel.shmmni = 4096 kernel.shmall = 15728640 kernel.sem = 5010 641280 5010 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 fs.aio-max-nr = 1048576 fs.file-max = 6815744

1、kernel.shmall: 共享内存页数的最大值,指系统一次可以使用的共享内存段的最大数量,以页为单位 Linux共享内存页大小为4KB(RedHat linux系统中页大小为4096即4K,实际环境以getconf PAGE_SIZE结果为准), 共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大可以设置16G,对应需要共享内存页数为16GB/4KB=16777216KB/4KB=4194304(页) 该参数数值根据系统内存大小对应设置优化

ORACLE默认是2097152 1G*1024*1024/4=262144 kernel.shmall = 1G/4k=1048576k/4k=262144 ---内存1G kernel.shmall = 2G/4k=2097152k/4k=524288 ---内存2G kernel.shmall = 4G/4k=4194304k/4k=1048576 ---内存4G kernel.shmall = 8G/4k=8388608k/4k=2097152 ---内存8G kernel.shmall = 16G/4k=16777216k/4k=4194304 ---内存16G kernel.shmall = 32G/4k=33554432k/4k=8388608 ---内存32G kernel.shmall = 64G/4k=67108864k/4k=16777216 ---内存64G

2、kernel.shmmax:单个共享内存段的最大值,单位为字节 shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应足够大,而且要大于Oracle中sga-max-size的值,否则会造成oracle性能下降,一般32bit操作系统,直接设置为系统支持的最大内存即可,64bit操作系统设置大于sga-max-size的值即可 ,一般情况下可以设置最大共享内存为物理内存的一半,如物理内存是 1G,则可以设置最大共享内存为 512 1024 1024 = 536870912;以此类推,在redhat上最大共享内存不建议超过410241024*1024-1=4294967295。

32位的操作系统4G最大值 4294967295 64位操作系统1G*1024*1024*1024-1即一个G{(1G*1073741824)-1} kernel.shmmax = 2147483647 ---内存2G kernel.shmmax = 4294967295 ---内存4G kernel.shmmax = 8589934592 ---内存8G kernel.shmmax = 12884901887 ---内存12G kernel.shmmax = 17179869184 ---内存16G kernel.shmmax = 34359738368 ---内存32G kernel.shmmax = 68719476736 ---内存64G

3、kernel.shmmni:共享内存段的最小数量 oracle设置默认值为4096,一般是足够用了,不需要调整

4、kernel.sem:对应4个值 SEMMSL、SEMMNS、SEMOPM、SEMMNI

(1)SEMMSL: 每个信号集的最大信号数量 当oracle DB初始化参数文件中PROCESSES参数设置较大时,需要调整SEMAPHORES设置SEMMSL应该设置为服务器中各个实例中最大的PROCESSES参数+10,例如,当最大的PROCESSES参数为5000时,SEMMSL应设置为5010。 Oracle 建议将 SEMMSL 的值设置为不少于 100 。 查看oracle 的最大连接数命令:

select * from v$license;

(2)SEMMNS:用于控制整个 Linux 系统中信号(而不是信号集)的最大数。 Oracle 建议将 SEMMNS 设置为:系统中每个数据库的 PROCESSES 实例参数设置值的总和,加上最大 PROCESSES 值的两倍,最后根据系统中 Oracle 数据库的数量,每个加 10 。 SEMMNS参数应设置为SEMMSLSEMMNI,接上例SEMMSL为5010,SEMMNS参数应为(5010128)=641280

(3)SEMOPM: 内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量。semop 系统调用(函数)提供了利用一个 semop 系统调用完成多项信号操作的功能。一个信号集能够拥有每个信号集中最大数量的SEMMSL 信号,因此建议设置 SEMOPM 等于SEMMSL ,Oracle 建议将 SEMOPM 的值设置为不少于 100 。

(4)SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量。 Oracle 建议将 SEMMNI 的值设置为不少于 100 。

以默认的配置kernel.sem = 250 32000 100 128为例: 250是参数semmsl的值,表示一个信号量集合中能够包含的信号量最大数目。 32000是参数semmns的值,表示系统内可允许的信号量最大数目。 100是参数semopm的值,表示单个semopm()调用在一个信号量集合上可以执行的操作数量。 128是参数semmni的值,表示系统信号量集合总数。 kernel.sem = 510 65280 510 128 --PROCESSES参数为500 kernel.sem = 1010 129280 1010 128 --PROCESSES参数为1000 kernel.sem = 3010 385280 3010 128 --PROCESSES参数为3000 4个值从左到右分别为semmsl、semmns、semopm和semmni 例:在oracle ora.init文件参数中设置PROCESSES参数为5000 则semmsl=5010,semmni=128,semmns=semmsl* semmni=641280 另外semopm建议设置等于semmsl值即5010 那么kernel.sem=5010 641280 5010 128 alter system set processes=1000 scope=spfile; alter system set sessions=1522 scope=spfile;

注意版本不同设置的区别: oracle11gR2之前的版本:sessions=processes1.1+5 oracle11gR2之后的版本:sessions=processes1.5+22

5、fs.aio-max-nr = 1048576 指系统允许的最大的异步IO请求大小oracle默认设置为1M即1048576,一般不用更改 6、fs.file-max = 6815744 fs.file-max指系统能够打开最大的文件句柄数 建议设置:fs.file-max=512processes=6.51024*1024=6.5M

二、其他内核参数

(1)内核TCP相关的参数均在/proc/sys/net/ipv4下,有以下选项

tcp_abort_on_overflow tcp_adv_win_scale tcp_allowed_congestion_control tcp_app_win tcp_autocorking tcp_available_congestion_control tcp_base_mss tcp_challenge_ack_limit tcp_congestion_control tcp_dsack tcp_early_retrans tcp_ecn tcp_fack tcp_fastopen tcp_fastopen_key tcp_fin_timeout tcp_frto tcp_invalid_ratelimit tcp_keepalive_intvl tcp_keepalive_probes tcp_keepalive_time tcp_limit_output_bytes tcp_low_latency tcp_max_orphans tcp_max_ssthresh tcp_max_syn_backlog tcp_max_tw_buckets tcp_mem tcp_min_tso_segs tcp_moderate_rcvbuf tcp_mtu_probing tcp_no_metrics_save tcp_notsent_lowat tcp_orphan_retries tcp_reordering tcp_retrans_collapse tcp_retries1 tcp_retries2 tcp_rfc1337 tcp_rmem tcp_sack tcp_slow_start_after_idle tcp_stdurg tcp_synack_retries tcp_syncookies tcp_syn_retries tcp_thin_dupack tcp_thin_linear_timeouts tcp_timestamps tcp_tso_win_divisor tcp_tw_recycle tcp_tw_reuse tcp_window_scaling tcp_wmem tcp_workaround_signed_windows

(2)ARP相关的内核参数,ARP缓存限制解释:

net.ipv4.neigh.default.gc_thresh1 在该值以下不gc,常驻缓存 net.ipv4.neigh.default.gc_thresh2 soft limit,可以临时超过该值,但只能保留5秒,之后会被gc掉 net.ipv4.neigh.default.gc_thresh3 hard limit,超过该值,就立即gc掉

(3)TCP相关的连接数:

tcp_max_syn_backlog: 半连接队列,是指定所能接受SYN同步包的最大客户端数量,即半连接上限; somaxconn: 全连接队列,指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。 tcp_max_syn_backlog:默认值为256 somaxconn:默认值为128,对应socket编程中的backlog,min{somaxconn,backlog}为实际值; 可以使用 ss -lnt中Recv-Q查看对列是否满

(4)关于net相关的参数

net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 262144 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30 net.ipv4.tcp_max_tw_buckets = 55000

对应参数的功能注释: 1、net.ipv4.ip_local_port_range 表示应用程序可使用的IPv4端口范围。oracle10g前建议端口范围为1024 65000,oracle11g建议端口范围为:9000 65500

2、net.core.rmem_default 表示套接字接收缓冲区大小的缺省值oracle建议设置为265K即262144

3、net.core.rmem_max 表示套接字接收缓冲区大小的最大值oracle10g及以前版本建议设置为256k即262144 oracle11g建议设置为4M 即4194304

4、net.core.wmem_default 表示套接字发送缓冲区大小的缺省值oracle建议设置为265K即262144

5、net.core.wmem_max 表示套接字发送缓冲区大小的最大值oracle10g及以前版本建议设置为256k即262144 oracle11g建议设置为1M即1048576

6、net.ipv4.tcp_tw_reuse 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接

7、net.ipv4.tcp_tw_recycle 启用timewait 快速回收(具体讲解见下文13)

8、net.ipv4.tcp_syncookies 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理

9、net.core.somaxconn 在web 应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGXLISTENBACKLOG默认为511,所以有必要调整这个值

10、net.core.netdev_max_backlog 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

11、net.ipv4.tcp_max_orphans 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,故而连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)

12、net.ipv4.tcp_max_syn_backlog 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128

13、net.ipv4.tcp_timestamps 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。 注意点 (1)tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开),其实意思就是假如服务端和客户端两边有一边timestamps没开启。tw_reuse和tw_recycle都没啥作用 (2)tw_reuse 只对客户端起作用,开启后客户端在1s内回收。reuse就是重用time_wait的socket连接。 服务端同一个端口被连接理论上是没限制的。 (3)tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。   内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量

原理分析 (1)MSL 由来   发起连接关闭方回复最后一个fin 的ack,为避免对方ack 收不到、重发的或还在中间路由上的fin 把新连接给丢掉了,等个2MSL(linux 默认2min)。也就是连接有谁关闭的那一方有time_wait问题,被关那方无此问题。 (2)reuse、recycle 通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么保证小的timestamp的 fin 不会fin掉新连接,不用等2MSL。 (3)reuse 通过timestamp 递增性,客户端、服务器能够处理outofbind fin包 (4)recycle 对于服务端,同一个src ip,可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接。

对于客户端 (1)作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大。 (2)tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。 (3)如果内网压测场景,且客户端不需要接收连接,同时tw_recycle 会有一点点好处。

对于服务端 (1)打开tw_reuse无效,因为是客户端连接web服务器,服务端肯定不会重用socket去主动连接客户端。这个参数服务器一般用不到,除非web服务器又作为客户端去连接后端数据库才用到 (2)线上环境 tw_recycle 不要打开 (3)服务器TIME_WAIT 高怎么办? 服务器time_wait不用担心,因为我是服务端,是客户端很多IP和端口主动连接我的一个端口,比如连接我的80端口。很可能出现一种情况就是虽然我机器上有10万个time_wait连接。但是我的端口才用到一个80端口。不像客户端有端口限制,处理大量TIME_WAIT Linux已经优化很好了,每个处于TIME_WAIT 状态下连接内存消耗很少, 而且也能通过tcp_max_tw_buckets = 262144 配置最大上限。

14、net.ipv4.tcp_synack_retries 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量

15、net.ipv4.tcp_syn_retries 在内核放弃建立连接之前发送SYN 包的数量

16、net.ipv4.tcp_fin_timeout 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外宕机。缺省值是60秒。2.2内核的通常值是180秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些

17、net.ipv4.tcp_keepalive_time 当keepalive 启用的时候,TCP发送keepalive消息的频度。缺省是2小时

18、net.ipv4.tcp_max_tw_buckets作用:在 TIME_WAIT 数量等于 tcp_max_tw_buckets 时,不会有新的 TIME_WAIT 产生。 这个值可能有什么不好的影响 在下面 2 条完全满足的情况下 1、当前服务器主动关闭连接 2、当前服务器 TIME_WAIT 数等于或大于 tcp_max_tw_buckets 可能会出现两种异常情况: ① 对端服务器发完最后一个 Fin 包,没有收到当前服务器返回最后一个 Ack,又重发了 Fin 包,因为新的 TimeWait 没有办法创建 ,这个连接在当前服务器上就消失了,对端服务器将会收到一个 Reset 包。因为这个连接是明确要关闭的,所以收到一个 Reset 也不会有什么大问题。(但是违反了 TCP/IP 协议) ② 因为这个连接在当前服务器上消失,那么刚刚释放的端口可能被立刻使用,如果这时对端服务器没有释放连接,当前服务器就会收到对端服务器发来的 Reset 包。如果当前服务器是代理服务器,就可能会给用户返回 502 错误。(这种异常对服务或者用户是有影响的) 如果不是类似 Nginx 之类的中间代理(即不担心端口耗尽),你通常不用关心这个值,使用官方默认的就好,甚至官方建议在内存大的情况下可以增加这个值。 类似 Nginx 之类的中间代理一定要关注这个值,因为它对你的系统起到一个保护的作用,一旦端口全部被占用,服务就异常了。 tcp_max_tw_buckets 能帮你降低这种情况的发生概率,争取补救时间。 建议nginx服务器在端口范围在65500个下配置,不是nginx服务器可忽略该配置(可根据实际环境情况优化到上限net.ipv4.tcp_max_tw_buckets = 262144): net.ipv4.tcp_max_tw_buckets = 55000

配置完这些之后使用如下命令重新加载生效

sysctl -p

三、关于资源限制

vi /etc/security/limits.conf oracle soft nproc 2048 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536

1、“soft” 和 “hard” 的区别

soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。 hard xxx : 代表严格的设定,不允许超过这个设定的值。

例如:soft 设为2048,hard设为16384 ,则当使用数在1~2048之间时可以随便使用,当使用数在2048~16384时则会出现警告信息,如果大于16384时,就会报错。

2、“nproc” 和 "nofile"的区别

nproc : 是操作系统级别对每个用户创建的进程数的限制 nofile : 是每个进程可以打开的文件数的限制

3、修改系统的配置 打开/etc/security/limits.conf (部分的系统是在/etc/security/limits.d/90-nproc.conf)

设置限制数量,第一列表示用户,* 表示所有用户 soft nproc :单个用户可用的最大进程数量(超过会警告); hard nproc:单个用户可用的最大进程数量(超过会报错); soft nofile :可打开的文件描述符的最大数(超过会警告); hard nofile :可打开的文件描述符的最大数(超过会报错);

4、备注

1)一般soft的值会比hard小,也可相等。 2)/etc/security/limits.d/里面配置会覆盖/etc/security/limits.conf的配置 3)只有root用户才有权限修改/etc/security/limits.conf 4)如果limits.conf没有做设定,则默认值是1024

四、关于ipcs命令查看共享内存、消息队列、信号量使用情况

(1)ipcs -l命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息

[oracle@localhost ~]$ ipcs -l ------ Messages Limits -------- max queues system wide = 7578 max size of message (bytes) = 8192 default max size of queue (bytes) = 16384 ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 524288 max total shared memory (kbytes) = 18014398442373116 min seg size (bytes) = 1 ------ Semaphore Limits -------- 信号量限制 max number of arrays = 128 最大数组数量 max semaphores per array = 250 每个数组的最大信号量数目 max semaphores system wide = 32000 系统最大信号量数 max ops per semop call = 100 每次信号量调用最大操作数 semaphore max value = 32767 信号量最大值

(2)ipcs -u命令可以查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数

[oracle@localhost ~]$ ipcs -u ------ Messages Status -------- allocated queues = 0 used headers = 0 used space = 0 bytes ------ Shared Memory Status -------- segments allocated 5 pages allocated 40 pages resident 40 pages swapped 0 Swap performance: 0 attempts 0 successes ------ Semaphore Status -------- 信号量状态 used arrays = 2 已使用数组 allocated semaphores = 168 已分配信号量数

(3)ipcs -p命令可以得到与共享内存、消息队列相关进程之间的消息

[oracle@localhost ~]$ ipcs -p ------ Message Queues PIDs -------- msqid owner lspid lrpid ------ Shared Memory Creator/Last-op PIDs -------- shmid owner cpid lpid 32768 root 12624 6914

(4)ipcs -a 查看当前使用的共享内存、消息队列及信号量所有信息

[oracle@localhost ~]$ ipcs -a ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x6c001f61 32768 root 600 292944 6 ------ Semaphore Arrays -------- key semid owner perms nsems 0x7a001f61 163840 oracle 600 12 0x00000000 196609 nobody 600 1 0x00000000 262146 nobody 600 1 0x00000000 294915 nobody 600 1 0x00000000 327684 nobody 600 1 0x00000000 491525 nobody 600 1

(5)ipcs的其他参数

ipcs -m  查看系统共享内存信息 ipcs -q  查看系统消息队列信息 ipcs -s  查看系统信号量信息 ipcs -t  查看最新调用IPC资源的详细时间 ipcs -c  查看IPC的创建者和所有者 额外格式控制: ipcs -l --human 以人类可以阅读的方式显示size
最新回复(0)