解决了一个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安装使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?