解决了一个oracle登录缓慢的问题

今天接到同事反映,说项目的页面访问缓慢,要我们查一下原因。

前端开发的同事查了一下,说是由于数据库操作缓慢,导致页面响应时间比较长。

我登录到数据库服务器,用vmstat查了一下,发现系统的idle非常高,说明服务器基本没有压力。

又让前台把前台用到的sql发给我,分别执行了一下,发现查询时间都很短。

感觉应该不是数据库的问题,于是让前台同事加多点日志继续定位,看是不是其它问题。

前端同事忙了一会儿,终于发现了真正的原因:每次连接请求第一次操作数据库时都比较慢。

查了一下源码,发现每个请求程序第一次操作数据库时都需要先连接一次数据库,而我们的数据库登录一次普通都要花上几秒钟

而一个页面有时需要发好几个请求,如果顺序处理就要花上十几秒才能返回。(由于是测试环境,设置的并发数不高,才4个)

我让前端同事改为数据库连接后不要释放,在所有请求里面复用。但前端同事表示它用的是php传统的部署方式,每次请示都需要fork一个新进程处理,请求处理完所有资源都会被释放,没办法这样做。

没办法,只能回到数据库来,看有没有办法优化数据库登录速度。

我登录到数据库主机,执行以下命令查看数据库连接情况:

while [ 1 ]; do tnsping orcl; sleep 1; done

发现即使在数据库主机上,执行tnsping耗时也是比较长的。网上查了一下,说可能是由于监听日志太大导致的。

虽然想不通为什么日志的大小会影响程序性能,不过还是试了一下:找到数据库的监听文件,发现有2G多。于是把监听停了,然后删除日志文件重启。

同时我还查了一下数据库的表空间占用情况,发现system空间几乎要满了。于是我顺便清理了一下system空间

清理过程中发现占用空间最大的是审计结果表。考虑到我们的数据库是在开发环境用的,不需要开审计,浪费空间又浪费性能,于是顺手把数据库审计也关了

经过以上操作后,发现数据库连接快了不少,大部分时候tnsping在1秒之内。

但奇怪的是偶尔还会有一两次(出现概率大概是1/20)tnsping要花上几秒钟才返回的情况。

网上查了一下,看有没有人碰上oracle数据库登录时快时慢的问题,没找到相关的文章。但发现有一个人提到他们数据库服务器配置的dns服务器id错误,导致数据库连接缓慢的问题,原因是oracle在客户端登录时,会尝试使用客户端的机器名去dns服务器查找对应的ip。如果dns服务器ip配置错误就会导致登录耗时比较长。

于是我打开机器的配置文件/etc/resolv.conf 看一下,看会不会我们也配置错误了。

不过发现里面配置的dns服务器为114.114.114.114,这是电信提供的公开的dns(类似谷歌提供的8.8.8.8),在我们机器上是可以正常连接的。

dns服务器没配置错,不过我想了一下,我们的机器都是内网的,使用公网的dns查局域网机器名肯定是查不到的。

根据以前的开发经验,查不到数据耗时肯定比查得到耗时长不少(因为本地缓存找不到,要访问远端机器)。

如果希望通过dns查找内网机器名ip,需要搭建局域网内部的dns服务器,太麻烦了。

考虑到这台数据库服务器除了使用yum安装软件外,平时没必要访问外网,于是把dns配置屏蔽了。

# Generated by NetworkManager
# nameserver 114.114.114.114

修改配置后重新执行

while [ 1 ]; do tnsping orcl; sleep 1; done

发现现在返回的tnsping数据都很正常了,不会再出现偶尔耗时异常的情况。

让前台同事试一下网页操作,也反馈现在系统反应速度很快,问题到此完美解决了。

后记:每次请求连接一次数据库始终不是一个好做法,后来我请教了一个比较有经验的同事,他介绍了一个数据库连接池中间件,说用这个可以解决php频繁连接数据库的问题

https://blog.csdn.net/21aspnet/article/details/50774684
PHP数据库连接池SQL Relay安装使用

posted @ 2020-10-06 11:14  皇家救星  阅读(2770)  评论(0编辑  收藏  举报