[转自Oracle官方技术博客]SLES12 SP2上遇到ORA-12518: TNS:listener could not hand off client connection

本文介绍了一个在SLES12SP2 Linux环境中遇到的ORA-12518错误问题。当数据库进程达到约300个时,新连接被拒绝。通过分析系统日志和strace输出,最终定位到systemd对进程数量的限制导致此问题。调整systemd配置后解决了该问题。


SLES12 SP2的linux上发生的问题,并不常见,但是给出了一些新的思路。

现象是数据库进程达到300个左右时,就无法继续连接数据库了,报以下错误。

ERROR:
ORA-12518: TNS:listener could not hand off client connection


15-AUG-2017 01:40:01 * (CONNECT_DATA=(CID=(PROGRAM=myapp)(HOST=__jdbc__)(USER=admin))(SERVER=DEDICATED)(SERVICE_NAME=oracle)) * (ADDRESS=(PROTOCOL=tcp)(HOST=11.22.33.44)(PORT=1521)) * establish * oracle * 12518
TNS-12518: TNS:listener could not hand off client connection
 TNS-12536: TNS:operation would block
  TNS-12560: TNS:protocol adapter error
  TNS-00506: Operation would block
  Linux Error: 11: Resource temporarily unavailable

问题可以一直重现,但是用户无法找到限制在哪儿,ulimit -a显示没有明显限制:

sa-server-0:grid:+ASM1 # 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) 513378
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1000000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

检查进程限制也没有异常:

sa-server-0:~ # cat /proc/5497/limits
Limit                     Soft Limit           Hard Limit           Units    
Max cpu time              unlimited            unlimited            seconds  
Max file size             unlimited            unlimited            bytes    
Max data size             unlimited            unlimited            bytes    
Max stack size            33554432             unlimited            bytes    
Max core file size        unlimited            unlimited            bytes    
Max resident set          unlimited            unlimited            bytes    
Max processes             513378               513378               processes
Max open files            65536                65536                files    
Max locked memory         unlimited            unlimited            bytes    
Max address space         unlimited            unlimited            bytes    
Max file locks            unlimited            unlimited            locks    
Max pending signals       513378               513378               signals  
Max msgqueue size         819200               819200               bytes    
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

让用户取了listener的strace,的确是clone函数失败,原因是资源不足(Resource temporarily unavailable)

STRACE
-------------------
filename=listener.strace

11404      0.000022 poll([{fd=8, events=POLLIN|POLLRDNORM}, {fd=11, events=POLLIN|POLLRDNORM}, {fd=13, events=POLLIN|POLLRDNORM}, {fd=14, events=POLLIN|POLLRDNORM}, {fd=15, events=POLLIN|POLLRDNORM}, {fd=16, events=POLLIN|POLLRDNORM}, {fd=17, events=POLLIN|POLLRDNORM}, {fd=3, events=POLLIN|POLLRDNORM}], 8, 60000) = 2 ([{fd=15, revents=POLLIN|POLLRDNORM}, {fd=3, revents=POLLIN|POLLRDNORM}]) <0.000012>
11404      0.000043 read(3, "\0\367\0\0\1\0\0\0\0016\1,\fA \0\177\377O\230\0\0\0\1\0\275\0:\0\0\0\0"..., 8208) = 247 <0.000010>
11404      0.000028 fcntl(3, F_GETFL)   = 0x802 (flags O_RDWR|O_NONBLOCK) <0.000008>
11404      0.000021 fcntl(3, F_SETFL, O_RDWR) = 0 <0.000008>
11404      0.000023 times({tms_utime=5483, tms_stime=2588, tms_cutime=440, tms_cstime=60}) = 1720115043 <0.000009>
11404      0.000096 fcntl(3, F_SETFD, 0) = 0 <0.000010>
11404      0.000027 pipe([18, 19])      = 0 <0.000012>
11404      0.000026 pipe([20, 21])      = 0 <0.000011>
11404      0.000024 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4e29b769d0) = -1 EAGAIN (Resource temporarily unavailable) <0.000197>  《============
11404      0.000219 close(18)           = 0 <0.000011>
11404      0.000022 close(19)           = 0 <0.000010>
11404      0.000023 close(20)           = 0 <0.000009>
11404      0.000021 close(21)           = 0 <0.000009>

检查OS log发现了一点端倪:

2017-08-16T02:36:55.560027+08:00 server-0 kernel: [ 165.619978] cgroup: fork rejected by pids controller in /system.slice/ohasd.service

' fork rejected by pids controller' 说明对进程数是有限制的。

 

最终的原因是因为在SUSE 12上增加了systemd的资源控制,其中默认参数:

DefaultTasksMax was default value(512).
systemd limited maximum number of tasks that may be created in the unit.
 这个值会影响 OS上的maxpid,将该参数设为无限制后解决该问题:

修改 /etc/systemd/system.conf

设置 DefaultTasksMax 的值为'infinity',重启主机。 

<think>我们遇到了一个具体的问题:在SLES 15 SP5系统中使用`zypper addrepo`命令添加阿里云仓库时,使用了`--no-gpg-check`选项,却提示`The flag --no-gpg-check is not known`。这表明该版本的zypper可能不接受`--no-gpg-check`标志。 根据我们对zypper命令的了解,在较新的版本中,跳过GPG检查的方式可能发生了变化。在SUSE系统中,我们通常有以下几种方法来跳过GPG检查: 1. 使用`--gpgcheck-strict`或`--gpgcheck`选项:在`zypper addrepo`命令中,我们可以明确设置仓库的GPG检查策略。例如,使用`--gpgcheck 0`或`--gpgcheck off`来禁用该仓库的GPG检查。 2. 在添加仓库后,修改仓库配置文件,将`gpgcheck`设置为0。 3. 全局禁用GPG检查(不推荐,因为会降低系统安全性)。 因此,针对用户的问题,我们可以尝试以下步骤: 步骤1:确认zypper版本 首先,我们可以检查一下zypper的版本,因为不同版本支持的选项可能不同。 步骤2:使用替代选项 根据zypper的帮助文档,我们尝试使用`--gpgcheck`选项来禁用GPG检查。 具体命令修改为: ```bash sudo zypper addrepo --gpgcheck 0 https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` 或者 ```bash sudo zypper addrepo --gpgcheck-off https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` 注意:不同的zypper版本可能支持不同的写法,我们可以查看帮助文档确认。 步骤3:如果上述方法不行,则添加仓库后手动修改配置文件 我们可以先添加仓库(不跳过检查,此时可能会因为GPG密钥问题而添加失败,但我们可以忽略,因为下一步要修改配置文件),然后修改该仓库的配置文件,将`gpgcheck`设置为0。 具体步骤: 1. 添加仓库(不带跳过检查的选项): ```bash sudo zypper addrepo https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` 2. 编辑该仓库的配置文件。zypper的仓库配置文件位于`/etc/zypp/repos.d/`目录下,文件名类似于`ali-sles.repo`(以.repo结尾)。 ```bash sudo vi /etc/zypp/repos.d/ali-sles.repo ``` 3. 在配置文件中,找到`[ali-sles]`部分,添加或修改一行: ```ini gpgcheck=0 ``` 4. 保存并退出,然后刷新仓库: ```bash sudo zypper refresh ``` 步骤4:全局禁用GPG检查(不推荐) 如果以上方法都不行,我们可以考虑全局禁用GPG检查。编辑zypper的全局配置文件`/etc/zypp/zypp.conf`,找到`gpgcheck`选项,将其值改为`off`。但这种方法会禁用所有仓库的GPG检查,存在安全风险,不推荐。 现在,我们按照最可能成功的方法(步骤2)来解决。 另外,我们还需要注意:阿里云的仓库URL是否正确?确保我们使用的URL是有效的。我们可以通过浏览器访问该URL,或者使用`curl`命令测试。 综上所述,我们给出的解决方案如下: 1. 使用`--gpgcheck`选项: ```bash sudo zypper addrepo --gpgcheck 0 https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` 或者尝试: ```bash sudo zypper addrepo --gpgcheck-off https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` 2. 如果上述命令仍然报选项未知,则采用手动修改配置文件的方法。 3. 刷新仓库: ```bash sudo zypper refresh ``` 4. 测试安装软件包。 注意:在SLES 15 SP5中,我们更推荐使用`--gpgcheck`选项的方式,因为这是zypper的标准选项。 如果用户在使用上述命令时仍然遇到问题,我们可以提供更详细的操作步骤,包括手动修改配置文件的方法。 下面我们按照步骤详细说明。 </think>### 解决 SLES 15 SP5 中 `--no-gpg-check` 标志无效的问题 在 SUSE Linux Enterprise Server 15 SP5 中,当使用 `sudo zypper addrepo --no-gpg-check` 命令时出现 `The flag --no-gpg-check is not known` 错误,这是因为从 SLES 15 开始,zypper 的选项语法发生了变化。请按以下步骤解决: #### ✅ 正确解决方案 1. **使用新语法替代旧标志** SLES 15+ 使用 `--gpgcheck` 替代旧的 `--no-gpg-check` 语法: ```bash sudo zypper addrepo --gpgcheck 0 https://mirrors.aliyun.com/repository/sles/15-SP5/ ali-sles ``` - `--gpgcheck 0`:明确禁用该仓库的 GPG 签名验证 - 确保 URL 末尾有 `/`(阿里云仓库路径要求) 2. **手动修改仓库配置** 添加仓库后修改配置文件: ```bash sudo vi /etc/zypp/repos.d/ali-sles.repo ``` 在 `[ali-sles]` 部分添加: ```ini gpgcheck=0 enabled=1 autorefresh=1 ``` 3. **刷新仓库验证配置** ```bash sudo zypper refresh ali-sles sudo zypper repos --uri | grep ali-sles ``` 检查输出中 `GPG Check` 列是否为 `No`。 #### ⚠️ 注意事项 1. **URL 准确性** 阿里云 SLES 15 SP5 仓库标准 URL: ``` https://mirrors.aliyun.com/repository/sles/15-SP5/ ``` - 架构后缀:x86_64 无需添加,ARM 需使用 `aarch64/` 路径 - 测试连接:`curl -I https://mirrors.aliyun.com/repository/sles/15-SP5/` 2. **安全警告** 禁用 GPG 检查仅建议在可信内部网络使用。生产环境应导入阿里云 GPG 密钥: ```bash sudo rpm --import https://mirrors.aliyun.com/repository/sles/15-SP5/repodata/repomd.xml.key ``` 然后移除 `gpgcheck=0` 配置。 3. **兼容性说明** | zypper 版本 | 有效语法 | |------------|----------| | SLES < 15 | `--no-gpg-check` | | SLES ≥ 15 | `--gpgcheck 0` | 该问题源于 SLES 15 对 zypper 的语法重构,新版本更强调显式声明验证策略而非二元开关[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值