访问接口很慢,报504 Gateway Time-out,排查记录

最近工作中遇到一个问题,访问一个接口,经常报504 Gateway Time-out。

项目用到nginx,数据库用的是oracle。

nginx报504 Gateway Time-out,是因为nginx中的相关参数默认配置的为60s,超过60s就报504 Gateway Time-out。

主要有以下这三个参数需要注意:

fastcgi_connect_timeout  # 同 FastCGI 服务器的连接超时时间,默认值60秒,它不能超过75秒;
fastcgi_send_timeout       # Nginx 进程向 FastCGI 进程发送 request ,整个过程的超时时间,默认值60秒;
fastcgi_read_timeout       # FastCGI  进程向  Nginx  进程发送 response ,整个过程的超时时间,默认值60秒;

我遇到的这个问题,大概率就是fastcgi_read_timeout超时了。但是也不能去把fastcgi_read_timeout的时间改大来处理,这个就是治标不治本。

这种情况下一般就是数据库访问超时导致的。

可以通过以下语句来查看oracle的等待信息:

SELECT s.sid,
       s.serial#,
       s.username,
       s.program,
       w.event,
       w.wait_time,
       w.seconds_in_wait
  FROM v$session s
  JOIN v$session_wait w ON s.sid = w.sid
 WHERE s.username IS NOT NULL
 ORDER BY w.wait_time DESC;

查询发现event为Direct Path Read的wait_time比较大。

因此这里就可以定位为Direct Path Read的问题

Direct Path Read是oracle 11g版本之后加上的,中文名叫直接路径读。

Direct Path Read的目的是让一些不常使用的大表数据(冷数据),在全表扫描时,每次都从磁盘读到用户的私有内存(PGA),而不要去挤占有限的、宝贵的、频繁使用的数据(热数据)所在的共享内存(SGA-buffer cache)。

热数据只在第一次访问时从磁盘读,读到SGA的buffer cache后,再次访问会直接从内存读,效率高、对存储压力小。

试想一个表被频繁全表扫描访问(缺少索引或业务设计不合理),一开始表还不算太大,会放到共享内存,只需要少量的磁盘读,这时对存储压力不大;随着记录数的不断增加,达到了某些条件后(下文会提到),就会使用direct path read,频繁的磁盘读就会造成存储的巨大压力,出现严重的性能问题。

从共享内存读到直接路径读,这个变化在不频繁的全表扫描时是起到积极作用的;如果业务不合理(一个大表正常情况不会有频繁的全表扫描)、或者缺少索引(这个是比较多的情况),频繁的大表全表扫描就会在某个触发点上对数据库性能做出致命一击,导致业务瘫痪。

有个隐含参数_serial_direct_read,决定dirrect path read的使用方式,默认是auto(共有false, true, never, auto, always几个选项),auto方式下有下面几个已知触发条件:

1、表大小超过 _small_table_threshold 隐含参数设置的阀值

2、表在buffer cache块数低于50%

3、表脏块数低于的25%

上面几个条件,只要有一个不满足,都不会使用Direct path read。频繁使用的大表,达到_small_table_threshold 阀值后,因为仍有大量数据在buffer cache,不会立即触发Direct path read,但是如果遇到其他大表挤占了buffer cache,buffer cache块数低于50%,就满足了触发条件。 

另外还有一个参数_very_large_object_threshold,默认值500,即表大小超过5倍_db_block_buffers时,也会选择direct path read。

如果能定期分析AWR,提前发现Top SQL存在的隐患,Direct Path Read这个功能还是有必要保留的,前提是需要对数据库做精细化的管理,可以把“杀手”变成帮手。

但是目前绝大多数数据库维护现状是不如人意的,这种情况还是建议把这个参数关闭:

alter system set "_serial_direct_read" = false sid = '*';

关闭之后就正常了,不会一直等待。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值