首页
学习
活动
专区
圈层
工具
发布

一次有趣的 DNS 导致 Node 服务故障问题分析实录

的实现是同步阻塞的,这与 Node 的异步显然是不搭的,于是 Node 使用线程池来调用 getaddrinfo,模拟异步。...libuv 默认会开启 4 个线程,可以通过 UV_THREADPOOL_SIZE 环境变量修改,最大不能超过 1024,然后初始化了 3 个队列,然后创建并启动线程。...= 0; i < nthreads; i++) if (uv_thread_create(threads + i, worker, &sem)) abort(); // 等所有线程启动完然后继续执行...GDB 确认问题 在 GDB 中,我们可以通过 thread + 线程号 切换到 SlowIO 处理的线程,也就是阻塞在 getaddrinfo 的线程。...还有一种可能的改法是调大线程池大小 UV_THREADPOOL_SIZE,都可以尝试。 当然下一步就是要去查看 redis 设置失败、myou.cvte.com 域名解析失败的原因了。

1.1K30

libuv在cocos2d-x中的使用

,本来之前项目用的是这个:clsocket https://github.com/DFHack/clsocket  当初选它的主要原因是它支持Windows、Linux、Mac OSX(我猜测的),但致命的缺点就是仅支持阻塞的...或者 uv_loop_t _loop) 2、初始化一个client,uv_tcp_init 3、连接指定的服务器,uv_tcp_connect 4、开启消息循环,uv_run 通常使用时,我们都需要新启动一个线程...,在该线程中来执行uv_run来保证不阻塞当前调用的线程(uv_run是阻塞的,不会立即返回)。...使用线程的关键函数:uv_thread_create(创建线程)、uv_async_init、uv_async_send(线程通信),消息的发送是异步的,在另外一个线程中多次(二次或更多)调用了uv_async_send...示例代码: uv_getaddrinfo_t* getaddrinfo_handle = (uv_getaddrinfo_t*)malloc(sizeof(uv_getaddrinfo_t)); getaddrinfo_handle

2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    IPV6 && Happy Eyeballs

    访问一个 Ipv6 的网站的过程是这样的: 通过 DNS 的 AAAA 解析获取到了域名对应的 Ipv6 的地址,然后就会通过 Ipv6 的地址访问网站,如果访问不通,业务就会挂掉,导致用户访问失败。...Happy Eyeballs 可以理解为对 ipv6 请求失败时的降级方案。...在这种场景下,就不要担心由于 Ipv6 的网络连通性比较差而导致站点无法访问了,即使在当前国内各运营商 Ipv6 连通性比较差的情况下,多的就是一个大概 200ms 的延迟,跟拒绝服务比起来,还算能接受...一般情况下,一个域名解析会有多个A记录,DNS 使用 round-robin 返回ip地址集合;当启用 ipv6 以后,DNS 则返回一个特定顺序的地址集合(参考这里);开发人员可能会采用 getaddrinfo...在这种情况,一个更优的做法是,启动两个线程分别访问 ipv4 和 ipv6,或者使用非拥塞的单进程(协程)同时发起connect,当获取到最快的一个响应后,拥塞其他响应。

    3.1K30

    一次 Node.js 服务线上问题引出的 DNS 缓存方案研究与思考

    于是我们登录服务器,筛选了下Node.js服务的日志: image.png 通过日志,我们可以很直观的看出问题所在:DNS解析失败 整理思路 作为一个日均流量过千万的Node.js服务,每个请求都需要解析...函数 dns.lookup()方法调用到最终,调用的是底层的getaddrinfo()函数(也就是上文报错点) 在C/C++代码中getaddrinfo函数是同步调用,所以需要libuv通过线程池来实现...Node.js的异步I/O 注:查阅相关资料,我们可以看到线程池默认大小是4 可以通过UV_THREADPOOL_SIZE环境变量设置。...Node.js v14中最大为1024 可能会出现的问题 当请求在DNS查询阶段耗时过长时,由于默认线程池过小,服务处理请求的速度跟请求数量远远不匹配,服务运行时间越长积压的请求数连接数就越多 关于默认缓存...由于dns.resolve()不使用getaddrinfo(),所以此时解析出来的地址为undefined 避免并行请求实现 利用Map对正在查询的hostname做缓存。

    2.8K30

    一次 Node.js 服务线上问题引出的 DNS 缓存方案研究与思考

    于是我们登录服务器,筛选了下Node.js服务的日志: 通过日志,我们可以很直观的看出问题所在:DNS解析失败 整理思路 作为一个日均流量过千万的Node.js服务,每个请求都需要解析N个内网接口域名...函数 dns.lookup()方法调用到最终,调用的是底层的getaddrinfo()函数(也就是上文报错点) 在C/C++代码中getaddrinfo函数是同步调用,所以需要libuv通过线程池来实现...Node.js的异步I/O 注:查阅相关资料,我们可以看到线程池默认大小是4 可以通过UV_THREADPOOL_SIZE环境变量设置。...Node.js v14中最大为1024 可能会出现的问题 当请求在DNS查询阶段耗时过长时,由于默认线程池过小,服务处理请求的速度跟请求数量远远不匹配,服务运行时间越长积压的请求数连接数就越多 关于默认缓存...由于dns.resolve()不使用getaddrinfo(),所以此时解析出来的地址为undefined 避免并行请求实现 利用Map对正在查询的hostname做缓存。

    1.4K20

    关于errno的后事妥善处理

    以前使用的定义是: extern int errno; 但是在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于自己的局部errno以避免一个线程干扰另一个线程。...出错恢复 可与将中定义的各种出错分出致命性的和非致命性的两类。对于致命性的错误,无法执行恢复动作,最多只能在用户屏幕上打印一条出错信息,或者将一条出错信息写到日志文件中,然后终止。...而对于非致命性错误,有课可以较为妥善的处理。大多数非致命性错误在本质上是暂时的,例如资源短缺,当系统中活动较少时,这种出错很可能就不会发生。 与资源相关的非致命性出错包括EAGAIN....当EINTR中断- -慢速系统调用时,可将它作为非致命性出错处理。 对于资源相关的非致命性出错,一般恢复动作是延迟一些时间, 然后再试。这种技术可应用于其他情况。...历史上,从系统V派生的实现,将这种系统调用视为失败,而BSD派生的实现则处理为部分成功返回。POSIX.1 标准的2001版采用BSD风格的语义。

    2.2K30

    缓存穿透,缓存雪崩,缓存击穿

    所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期 从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程...这种还不是最致命的,集中过期,理论上数据库也是能顶住压力的。 最致命的是当redis缓存服务器宕机导致,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。...直接打死mysql 4、源头服务因为mysql被打死也崩溃,对源服务的请求也hang住,占用资源 5、缓存服务大量的资源全部耗费在访问redis和源服务无果,最后自己被拖死,无法提供服务 6、nginx无法访问缓存服务...发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 二:redis集群化高可用(哨兵,redis cluster,双机房部署,一部分几点部署在另一个机房) 事中 redis缓存服务器宕机,有大量请求无法访问...redis数据彻底丢失了,或者数据过旧,快速缓存预热,redis重新启动起来 事中代码::对redis进行资源隔离 com.netflix.hystrix

    2.1K30

    CMQ消费者报错,无法获取本机ip地址问题排查

    问题排查原因及解决方案 我们先来看看报错的截图: image.png 初步看来是RequestIdHelper这个类初始化失败,这种问题往往是静态代码块或者实例变量初始化异常造成。...try { // 1.获取hotname,这是个native方法,hotspot中实现非常简单, 直接系统调用gethostname,如果调用失败...那么接着分析下这个getaddrinfo是如何执行的。下面写一段代码,准备使用strace分析分析。...,尝试获取,如果失败,则使用DNS客户端进行域名解析处理 * 打开文件/etc/services,查找服务 * 打开etc/host.conf 该配置文件为域名解析顺序配置文件,设定解析顺序方式...但是这种方案有三个问题,一个是ip地址可能会被瞎写,一个是不同系统设置不同,可能会导致像这次故障一样应用起不来,最后一种就是查询过程中有getnameinfo走dns解析,假如这里网络异常不但可能起不来,还可能使得应用启动缓慢

    1.9K125

    ASM Instances管理

    级别的磁盘组中有磁盘损坏的话,ASM 提供 mount force命令来强制mount磁盘组 前提是磁盘组中有至少一份完整的数据文件拷贝 注意:如果磁盘组中的磁盘都是好的,这时使用mount force,会导致命令失败...2.2 RESTRICT模式 当ASM以RESTRICT模式启动时,磁盘组是以RESTRICT模式挂载的,这种情况下数据库无法访问ASM磁盘组,便于维护 startup mount RESTRICT...shutdown命令来关闭ASM实例,它有如下参数: NORMAL ASM 等待现有SQL执行完成后才会dismount磁盘组,然后需要等到所有用户断开连接才会关闭实例 如果有数据库实例连接到ASM实例,则该命令失败...IMMEDIATE 或TRANSACTIONAL ASM 等待现有SQL执行完成后才会dismount磁盘组,然后不需要等到所有用户断开连接才会关闭实例 如果有数据库实例连接到ASM实例,则该命令失败...ASMB 进程运行在数据库端用来和ASM进程通信以及管理存储,ASM端运行cp命令或者使用spfile启动时会在ASM端出现 GMON进程负责维护磁盘组中的磁盘成员关系 MARK 进程负责将写入损坏磁盘失败的

    1.2K10

    一个简单的爬虫

    一个基本的爬虫通常分为数据采集(网页下载)、数据处理(网页解析)和数据存储(将有用的信息持久化)三个部分的内容,当然更为高级的爬虫在数据采集和处理时会使用并发编程或分布式技术,这就需要有调度器(安排线程或进程执行对应的任务...当服务器无法访问时,按照指定的重试次数尝试重新下载页面。 在需要的时候设置用户代理或隐藏真实IP,否则可能无法访问页面。 对获取的页面进行必要的解码操作然后抓取出需要的信息。...in links_list: if link not in visited_url_list:...visited_url_list[link] = depth + 1 page_html = get_page_html(link, charsets...["\']', max_depth=2) if __name__ == '__main__': main() 由于使用了MySQL实现持久化操作,所以要先启动

    52020

    YashanDB 报错 YAS-07301:通过 dblink 查询 Oracle 超时?可能是系统资源瓶颈

    【问题描述】某用户在使用 yasql 通过 dblink 查询 Oracle 数据时,执行以下语句:select 1 from dual@link_oracle;报错如下:YAS-07301 external...module timeout, reason: yex_server heartbeat timeout【问题影响】所有版本的 YashanDB 均可能受影响;导致 dblink 功能失效,外部数据源无法访问...发现如下错误:[YEX] failed to run yex_server, error no:-1YashanDB 使用 Linux 系统调用 system(const char * command) 启动...正常情况:该调用返回 0;报错情况:返回 -1.表示执行失败。深入分析系统 glibc 源码发现,该错误大概率是由于 fork() 系统调用失败,常见于操作系统资源紧张时。...【可能触发条件】当前系统进程数已接近上限;可用内存不足,fork 新进程失败;某些耗资源进程未释放,系统调度受阻。

    15110

    Flink 实践教程:进阶7-基础运维

    Kafka 的 Timeout expired while fetching topic metadata 表示初始化超时; MySQL 的 Communications link failure...JVM 退出等致命错误:进程退出码通常出现在 exit code/shutting down JVM/fatal/kill/killing 关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭等的错误...总结 本文首先对出现的最基础的、用户可以自己解决的常见报错做了一些总结,这些错误常常出现在作业启动之前,所以在作业正式启动之前,用户需要自己检查好这些类型的错误,保证作业能够顺利的启动。...之后介绍了下作业启动之后的一些基础运维手段,包括实时监控和告警通知,方便用户及时了解作业的具体运行情况。最后介绍了在作业失败之后通过日志关键字定位问题的方法,具体可以查看 日志诊断指南[6]。...需尝试增加作业的算子并行度(CU)数和优化内存占用,避免内存泄露 JVM 退出等致命错误 进程退出码通常出现在以下关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭等的错误:exit

    3.1K31

    Docker+Wordpress建站问题总结记录

    Wordpress] 仪表盘 - 设置更改固定连接后无法访问了 (更改未进行备案域名/未进行Nginx反向代理) 问题产生原因: 如果更改为域名(例如未进行备案域名) 因域名无法直接访问, 模拟请求过程...PC 电脑浏览器输入 IP: 端口 Wordpress 收到请求后自动重定向设置的域名,这时候域名无解析 / 未备案导致无法访问所以界面显示 404 或其他界面....* from wp_otion where option_value=‘从仪表盘设置的域名/IP’; $ select * from wp_otion where option_value link...comment_author_url = replace(comment_author_url, 'http://旧域名', 'http://新域名') ; 运行后wordpress mysql链接失败...Q1 问题描述: 启动时IP使用127.0.0.1 / localhost / 0.0.0.0 管理界面初始化时访问失败 Docker-Wordpress连接 Docker-mysql A1 解决方案

    1.4K10
    领券