症状:
客户端无法建立新连接。
客户端无法在连接失败时自动重新连接。
可能的原因:
可能的原因:客户端应用程序不关闭连接,导致连接数超出资源限制。
确认问题的起因:列出代理的所有连接:
imqcmd list cxn
输出结果将列出所有连接以及发起每个连接的主机,从而显示具体是哪些客户端的打开连接数超出限制。
解决此问题:重写有问题的客户端,以关闭未使用的连接。
可能的原因:代理未运行或者网络连接有问题。
确认问题的起因:
远程登录 (telnet) 到代理的主端口(例如,默认端口 7676),并验证代理是否以端口映射器输出作为响应。
验证代理进程是否正在主机上运行。
解决此问题:
启动代理。
修复网络连接问题。
可能的原因:连接服务处于非活动状态或者已暂停。
确认问题的起因:检查所有连接服务的状态:
imqcmd list svc
如果某个连接服务的状态显示为 unknown 或 paused,客户端将无法使用该服务建立连接。
解决此问题:
如果连接服务的状态显示为 unknown,它将不会出现在活动服务列表 (imq.service.active) 中。如果是基于 SSL 的服务,则还可能是因为服务未正确配置,导致代理在代理日志中生成下面的条目:
错误 [B3009]:无法启动服务 ssljms:[B4001]:无法打开 ssljms 服务的协议 tls...
后面说明了引起此异常的根源。
要正确配置 SSL 服务,请参见消息加密。
如果连接服务的状态显示为 paused,请恢复该服务(请参见暂停和恢复连接服务)。
可能的原因:相对于所需的连接数而言,可用线程数不足。
确认问题的起因:在代理日志中检查下面的条目:
警告 [B3004]:服务上没有可以用来处理新连接的线程...关闭新连接。
此外,请检查连接服务上的连接数以及当前使用的线程数(使用以下格式之一):
imqcmd query svc -n serviceName imqcmd metrics svc -n serviceName -m cxn
每个连接都需要两个线程:一个用于传入消息,另一个用于传出消息(请参见线程池管理)。
解决此问题:
如果使用专用线程池模型 (imq.serviceName.threadpool_model=dedicated),则最大连接数是该线程池中的最大线程数的一半。因此,要增加连接数,请增加线程池的大小 (imq.serviceName.max_threads) 或切换到共享线程池模型。
如果使用共享线程池模型 (imq. serviceName.threadpool_model=shared),则最大连接数是连接监视限制 (imq.serviceName.connectionMonitor_limit) 和最大线程数 (imq.serviceName.max_threads) 乘积的一半。因此,要增加连接数,可以增加线程池的大小或增大连接监视限制。
最终,可支持的连接数(或连接上的吞吐量)将达到输入/输出限制。这种情况下,可以使用多代理群集在群集内的代理实例之间分布连接。
可能的原因:相对于 Solaris 或 Linux 平台上需要的连接数而言,文件描述符不足。
有关此问题的详细信息,请参见设置文件描述符限制。
确认问题的起因:在代理日志中查找与下面显示的条目类似的条目:
打开了太多文件
解决此问题:增大文件描述符限制,如 ulimit 手册页中所述。
可能的原因:TCP 后备队列限制了可以同时建立的新连接请求的数目。
TCP 后备队列限制可以同时存储在系统后备队列 (imq.portmapper.backlog) 中的连接请求数,超过此限制后,端口映射器将拒绝额外的请求。(在 Windows 平台上,有一种硬编码的后备队列限制:Windows 台式机限制为 5,而 Windows 服务器限制为 200。)
出于后备队列限制而拒绝请求通常是一种由于同时连接请求数过多而导致的瞬态现象。
确认问题的起因:检查代理日志。首先,检查代理是否在接受某些连接的同时拒绝其他连接。其次,检查说明拒绝连接原因的消息。如果找到此类消息,则说明问题可能不是由 TCP 后备队列引起的,因为代理不记录由于 TCP 后备队列而引起的连接拒绝事件。如果记录了一些成功连接,但未记录任何连接拒绝事件,则问题可能是由 TCP 后备队列引起的。
解决此问题:
对客户端进行编程,使其在较短的时间间隔后重试所尝试的连接(此方法之所以生效通常是由于此问题的瞬态性)。
增加 imq.portmapper.backlog 的值。
检查客户端是否过于频繁地反复关闭和打开连接。
可能的原因:操作系统限制了并发连接数。
Windows 操作系统许可证对支持的并发远程连接数进行了限制。
确认问题的起因:检查是否有可用于连接的足够线程(使用 imqcmd query svc),并检查您的 Windows 许可协议的条款。如果您可以从本地客户端建立连接,但不能从远程客户端建立连接,则操作系统的限制可能就是问题的起因。
解决此问题:
升级 Windows 许可证,以允许更多的连接。
通过设置多代理群集在多个代理实例之间分布连接。
可能的原因:对用户的验证或授权失败。
验证可能因为以下原因失败:
密码错误
在用户系统信息库中没有该用户的条目
该用户没有对连接服务的访问权限
确认问题的起因:检查代理日志中的条目,查看是否有 Forbidden 错误消息。此消息指明存在验证错误,但不会指明该错误的原因。
如果使用的是基于文件的用户系统信息库,请输入下面的命令:
imqusermgr list -i instanceName -u userName
如果输出结果显示的是用户,说明可能提交了错误的密码。如果输出显示以下错误,则说明用户系统信息库中不存在该用户的条目:
错误 [B3048]:密码文件中不存在用户
如果使用的是 LDAP 服务器用户系统信息库,请使用相应的工具检查是否存在该用户的条目。
检查访问控制文件以查看是否对连接服务有访问限制。
解决此问题:
如果使用了错误的密码,请提供正确的密码。
如果在用户系统信息库中没有该用户的条目,请添加一个条目(请参见填充和管理用户系统信息库)。
如果该用户没有对连接服务的访问权限,则编辑访问控制属性文件以授予访问权限(请参见用于连接服务的访问控制)。