Reactor

异常连接导致的内存泄漏排查

穿精又带淫゛_ 提交于 2021-02-18 01:18:19
背景 在生产环境中,部署在客户的程序在运行了将近两个月后发生了闪退。而且两个服务器的程序先后都出现了闪退现象。通过排查windows日志发现是OOM异常导致的闪退。本文记录了该异常事件完整的排查过程与解决方案。 在本篇文章中会涉及到以下技术知识点:使用windbg对dump文件进行内存分析、使用wireshark抓包分析、powershell脚本编写、完成端口及重叠I/O原理等。 详细流程 程序崩溃后,我们要求客户导出一个dump文件供我们分析,并提供程序相关的运行日志。同时查看了windows的相关日志确定了是由于OOM(Out Of Memory)异常导致的。 使用windbg分析dump文件 启动windbg打开dump文件 由于我们的程序是基于 .net framework 3.5 开发的,因此我们使用 SOS 的相关扩展命令进行分析。需要在windbg中导入 mscorwks .loadby sos mscorwks 想对windbg进行深入学习,可以查看《使用WinDbg》讲解的非常详细。 通过 !dumpheap -stat 对内存占用情况进行汇总统计。 ! dumpheap -stat .. . 00007ff7ffbc0d50 536240 17159680 NetMQ.Core.Utils.Proactor+Item 00007ff7ffbca7f8

PHP面试-复习知识点整理

ぐ巨炮叔叔 提交于 2021-02-11 13:19:54
false的七种情况 整型0 浮点0.0 布尔false 空字符串'',"" 字符串'0' 空数组[] NULL 超全局数组 $GLOBALS,包含下面8个超全局数组的值 $_GET $_POST $_REQUERT,包含$_GET,$_POST,$_COOKIE $_SEESION $_COOKIE $_SERVER $_SERVER['SERVER_ADDR'] //服务器地址 $_SERVER['SERVER_NAME'] //服务名称 $_SERVER['REQUEST_TIME'] //请求时间 $_SERVER['QUERY_STRING'] //请求地址中问号后的内容 $_SERVER['HTTP_REFERER'] //上次请求地址 $_SERVER['HTTP_USER_AGENT'] //浏览器信息 $_SERVER['REMOTE_ARRR'] //客户端请求ip $_SERVER['REQUEST_URI'] // 请求中脚本名称 $_SERVER['PATH_INFO'] // 请求中路径 $_FIELS $_ENV null的三种情况 直接赋值NULL 未定义变量 unset销毁后的变量 常量 一定定义,不可删除和修改 const 更快,是语言结构,可定义类常量 define 是函数 预定义常量 FILE 文件所在路径+文件名 LINE 所在代码行

Spring Reactor Merge vs Concat

本小妞迷上赌 提交于 2021-02-04 18:39:05
问题 I´m playing with Spring reactor, and I cannot see any differences between concat and merge operator Here's my example @Test public void merge() { Flux<String> flux1 = Flux.just("hello").doOnNext(value -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); Flux<String> flux2 = Flux.just("reactive").doOnNext(value -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }); Flux<String> flux3 = Flux.just("world"); Flux.merge

Spring Reactor Merge vs Concat

☆樱花仙子☆ 提交于 2021-02-04 18:38:50
问题 I´m playing with Spring reactor, and I cannot see any differences between concat and merge operator Here's my example @Test public void merge() { Flux<String> flux1 = Flux.just("hello").doOnNext(value -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); Flux<String> flux2 = Flux.just("reactive").doOnNext(value -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }); Flux<String> flux3 = Flux.just("world"); Flux.merge

并发模型与IO模型梳理

允我心安 提交于 2021-01-31 00:26:53
并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见。由于go语言的兴起,CSP模型也越来越受关注。基于锁的共享内存模型与后两者的主要区别在于,到底是通过共享内存来通信,还是通过通信来实现访问共享内存。由于actor模型和CSP模型,本人并不是特别了解,我主要说说最基本的并发模型,基于线程与锁的内存共享模型。 为什么要并发,本质都是为了充分利用多核CPU资源,提高性能。但并发又不能乱,为了保证正确性,需要通过共享内存来协调并发,确保程序正确运转。无论是多进程并发,还是多线程并发,要么通过线程间互斥同步(spinlock,rwlock,mutex,condition,信号量),要么通过进程间通信(共享内存,管道,信号量,套接字),本质都是为了协同。多线程和多进程本质类似,尤其是linux环境下的pthread库,本质是用轻量级进程实现线程。下面以网络服务为例,简单讨论下多线程模型的演进。 最简单的模型是单进程单线程模型,来一个请求处理一个请求,这样效率很低,也无法充分利用系统资源。那么可以简单的引入多线程,其中抽出一个线程监听,每来一个请求就创建一个工作线程服务,多个请求多个线程,这就是多线程并发模型。这种模式下,资源利用率是上去了,但是却有很多浪费,线程数与请求数成正比,意味着频繁的创建/销毁线程开销

外行人都能看懂的WebFlux,错过了血亏!

限于喜欢 提交于 2021-01-14 07:59:37
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y 本文知识点架构: 知识点架构 如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。 我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习 WebFlux 也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好… 之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学 WebFlux 啦~ 这篇文章主要讲解什么是 WebFlux ,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的) 一、什么是WebFlux? 我们从 Spring 的官网拉下一点点就可以看到介绍 WebFlux 的地方了 WebFlux的简介 从官网的简介中我们能得出什么样的信息? 我们程序员往往 根据不同的应用场景选择不同的技术 ,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而 Spring5 提供了一整套 响应式 (非阻塞)的技术栈供我们使用(包括Web控制器、权限控制

外行人都能看懂的WebFlux,错过了血亏

房东的猫 提交于 2021-01-14 07:42:30
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y 本文知识点架构: 知识点架构 如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。 我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习WebFlux也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好… 之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学WebFlux啦~ 这篇文章主要讲解什么是WebFlux,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的) 一、什么是WebFlux? 我们从Spring的官网拉下一点点就可以看到介绍WebFlux的地方了 WebFlux的简介 从官网的简介中我们能得出什么样的信息? 我们程序员往往根据不同的应用场景选择不同的技术,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而Spring5提供了一整套响应式(非阻塞)的技术栈供我们使用(包括Web控制器、权限控制、数据访问层等等)。

swoole详解

喜你入骨 提交于 2021-01-13 17:53:40
1、swoole结构图 2、swoole流程图 3、详细流程图 3.1、Master:处理核心事件驱动(主进程) 3.2、Reactor:   处理TCP连接,收发数据的线程。Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。,   3.2.1、负责维护客户端TCP连接、处理网络IO、处理协议、收发数据   3.2.2 、 完全是异步非阻塞的模式   3.2.3、全部为C代码,除Start/Shudown事件回调外,不执行任何PHP代码   3.2.4、将TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包   3.2.5、Reactor以多线程的方式运行 3.3、Manager进程:   3.3.1、swoole中worker/task进程都是由Manager进程Fork并管理的。   3.3.2、子进程结束运行时,manager进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程   3.3.3、服务器关闭时,manager进程将发送信号给所有子进程,通知子进程关闭服务   3.3.4、服务器reload时,manager进程会逐个关闭/重启子进程 3.4

每日一面

落爺英雄遲暮 提交于 2021-01-10 14:38:28
1. 为啥需要 负载因子(defaultLoadFactor) 现在主流的 HashMap,一般的实现思路都是开放地址法+链地址法的方式来实现。 即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上。在 Java 8 之后,链表过长还会转化为红黑树。 红黑树相较于原来的链表,多占用了一倍的空间,但是查询速度快乐一个数量级,属于空间换时间。 同时,链表转换红黑树也是一个耗时的操作。并且, 一个效率高的哈希表,这个链表不应该过长 。 所以,如果数组的很多元素上面已经有值了,那么就需要将这个数组扩充下,重建哈希表,也就是 rehash,因此这个 rehash 相当耗时。那么什么时候扩容呢? **当数组填满的时候?**那么在数组快要填满的时候,会发生很多需要将元素加到对应位置的链表上的情况,并且增加产生红黑树的概率。这显然不可取。 这个 defaultLoadFactor 就是一个比较合适的, 哈希表需要扩容的时候的 数组中有占用元素的比例 。 2. 这个比例如何计算? 其实,这个并没有一个统一的结论,因为不同场景下,肯定考虑的方面不同,这个数字最好能最通用。但是, 目前不同语言的 defaultLoadFactor 并不一样 ,比如 Java 是 0.75,Go 中是 0.65,Dart 中是0.8,python 中是0.762.

为什么 Redis 单线程能达到百万+QPS?

我怕爱的太早我们不能终老 提交于 2021-01-10 11:01:40
作者:在江湖中coding https://juejin.im/post/5e6097846fb9a07c9f3fe744 性能测试报告 查看了下阿里 Redis 的性能测试报告如下,能够达到数十万、百万级别的 QPS (暂时忽略阿里对 Redis 所做的优化),我们从 Redis 的设计和实现来分析一下 Redis 是怎么做的。 Redis的设计与实现 其实 Redis 主要是通过三个方面来满足这样高效吞吐量的性能需求 高效的数据结构 多路复用 IO 模型 事件机制 1、高效的数据结构 Redis 支持的几种高效的数据结构 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合) 以上几种对外暴露的数据结构它们的底层编码方式都是做了不同的优化的,不细说了,不是本文重点。 2、多路复用 IO 模型 假设某一时刻与 Redis 服务器建立了 1 万个长连接,对于阻塞式 IO 的做法就是,对每一条连接都建立一个线程来处理,那么就需要 1万个线程,同时根据我们的经验对于 IO 密集型的操作我们一般设置,线程数 = 2 * CPU 数量 + 1,对于 CPU 密集型的操作一般设置线程 = CPU 数量 + 1。 当然各种书籍或者网上也有一个详细的计算公式可以算出更加合适准确的线程数量,但是得到的结果往往是一个比较小的值,像阻塞式 IO