记一次连接Redis偶现超时的问题

phpmianshi1个月前 (07-03)运维64
记一次连接Redis偶现超时的问题
问题描述公司老的项目没有任何监控,对于系统的运行健康情况完全不知,于是搭建了2套监控系统,一套sentry监控代码层面的exception,一套cls告警,监控所有系统的状态码,应用日志等。监控系统上...

记一次laravel项目因opcache导致的include过慢问题

phpmianshi2个月前 (06-12)运维84
问题表现 php-fpm-slow.log 大量如下日志:script_filename = /data/nginx/webroot/app-20200611-160330-feb...

记一次laravel项目因session导致cpu过高的问题

phpmianshi2个月前 (05-26)运维142
问题起因:腾讯云监控CPU过高报警  10:20-10:28左右持续 百分之80以上。问题排查:1. 查看php-fpm慢日志发现有大量如下日志:[26-May-2020 ...

Certbot-免费的https证书

phpmianshi2年前 (2018-05-06)运维93
什么是HTTPS?HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传...

Nginx面试中最常见的18道题

phpmianshi4年前 (2016-05-06)运维157
1、请解释一下什么是Nginx?Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以其高性能...

nginx中request_time和upstream_response_time详解

phpmianshi4年前 (2016-04-22)运维43
背景最近监控报警有短暂的502,赶紧分析问题原因,查看nginx的access_log 发现短暂报警的request_time比较大,但是upstream_response_time有2个值,一个比较...

linux中sed用法读这一篇就够了

phpmianshi4年前 (2016-04-21)运维46
1.概念sed是一种行编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的...

linux中配置内核参数sysctl详解

phpmianshi4年前 (2016-04-20)运维40
概念sysctl用于运行时配置内核参数,这些参数位于/proc/sys目录下。sysctl配置与显示在/proc/sys目录中的内核参数。用户只需要编辑/etc/sysctl.conf文件,即可手工或...

linux中tcpdump的详细用法

phpmianshi4年前 (2016-04-19)运维60
linux中tcpdump的详细用法
在调试网络通信程序是tcpdump是必备工具。tcpdump很强大,可以看到网络通信的每个细节。如TCP,可以看到3次握手,PUSH/ACK数据推送,close4次挥手,全部细节。包括每一次网络收包的...

linux中如何查看系统io使用情况

phpmianshi4年前 (2016-04-18)运维54
linux中查看IO的方法主要有下面几种方法:1. top   %wa    的含义是等待输入输出的CPU时间百分比,这个数字越高说明越多的CPU资源...

linux中cpu占用过高排查方法

phpmianshi4年前 (2016-04-17)运维54
CPU使用率查看top通过top -d 0.1可以缩短采样时间。-d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。load average后面的三个数分别是1分钟、5分钟...

linux中nf_conntrack table full dropping packet问题处理

phpmianshi4年前 (2016-04-16)运维49
概述:在日常的服务器运维过程中,发现某段时间 /var/log/messages日志报错nf_conntrack:table full,drop packet简介:nf_connt...

linux中高并发场景下too many open files问题处理

phpmianshi4年前 (2016-04-15)运维53
概述:高并发场景下 too many open files 问题。可以通过设置系统打开文件数,直接影响单个进程容纳的客户端连接数。比如会影响到长链接应用如聊天中单个进程能够维持的用户连接数, 运行ul...

linux中Cannot assign requested address的问题处理

phpmianshi4年前 (2016-04-14)运维50
问题描述:最近系统报警有类型如下错误:Cannot assign requested address  主要是连接mysql时产生的错误。分析原因:客户端与服务端每建立一个连接,客户端一侧都...

linux中查看系统活动情况报告sar命令详解

phpmianshi4年前 (2016-04-13)运维65
有很多工具可以看网络流量,但我最喜欢sar。sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多...

linux中连接数过多(TIME_WAIT/CLOSE_WAIT)读这一篇就够了

phpmianshi4年前 (2016-04-12)运维64
根据TCP/IP介绍,socket大概包含10个连接状态。我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题。TIME_WAIT一般...

linux中netstat和ss命令详解

phpmianshi4年前 (2016-04-11)运维56
由于nio的普及,ck10k的问题已经成为过去式。现在随便一台服务器,都可以支持数十万级别的连接了。那么10万的连接需要多少资源呢?由于一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个so...

linux中lsof命令详解

phpmianshi4年前 (2016-04-10)运维210
简介lsof(list open files)是一个列出当前系统打开文件的工具,在Unix中一切(包括网络套接口)都是文件。有趣的是,lsof也是有着最多开关的Linux/Unix命令之一。它有那...

linux中浅谈端口占用和开闭管理

phpmianshi4年前 (2016-04-09)运维190
背景平时开发或线上运维少不了跟端口打交道,今天我们简单聊聊平时跟端口相关的几个场景首先查看某台主机某个端口服务是否正常比如查看本机 redis服务是否正常telnet 127.0.0.1&n...

Linux中nio的实现原理

phpmianshi4年前 (2016-04-08)运维97


1、应用程序中调用read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。

2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候,read() 调用返回,且引发一次上下文切换(内核态->用户态),现在数据已经被拷贝到了用户地址空间缓冲区,这时,如果有需要,应用程序可以操作修改这些内容。

3、我们最终目的是把这个文件内容通过Socket传到另一个服务中,调用Socket的send()方法,这里又涉及到一次上下文切换(用户态->内核态),同时,文件内容被进行第三次拷贝,被再次拷贝到内核地址空间缓冲区,但是这次的缓冲区与目标套接字相关联,与读取缓冲区没有半点关系。

4、send()调用返回,引发第四次的上下文切换,同时进行第四次的数据拷贝,通过DMA把数据从目标套接字相关的缓存区传到协议引擎进行发送。

"在整个过程中,过程1和4是由DMA负责,并不会消耗CPU,只有过程2和3的拷贝需要CPU参与


如果在应用程序中,不需要操作内容,过程2和3就是多余的,如果可以直接把内核态读取缓存冲区数据直接拷贝到套接字相关的缓存区,是不是可以达到优化的目的?

我们上一篇文章 《linux中netstat和ss命令详解》中提到了nio 原文:https://phpmianshi.com/?id=105有一些小伙伴私信想了解什么是nio,我们这篇详细介绍下什么...