大家好,欢迎来到IT知识分享网。
最近工作中遇到一个问题,访问一个接口,经常报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 = ‘*’;
关闭之后就正常了,不会一直等待。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/123213.html