
#Linux
文章平均质量分 50
Linux基础知识
一只特立独行的猪( ﹡ˆoˆ﹡
精益求精
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
close_wait状态的实例:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程【个人总结】
文章主要是通过观察实例来说明close_wait状态的问题,一般导致close_wait状态都不是有意的,而是操作不注意就会导致此问题的出现。根据当时的表现是分别进行了以下猜想。这基本是不可能的,如果负载均衡器出问题了,那么问题大多出现是大面积的故障,而不但单单是一个服务,所以排除这个选项。目前看起来应该是代码质量问题,加之本次数据有异常,触发到了以前某个没有测试到的点,目前看起来很有可能是这个原因。有了上面的的依据,推出的结果是肯定是该服务依赖的底层资源除了问题,要不然不可能独立集群的服务同时出问题。原创 2024-09-17 22:39:01 · 739 阅读 · 0 评论 -
epoll的剖析mmap
一张图总结一下select,poll,epoll的区别:epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。目前流行的高性能web服务器Nginx正式依赖于epoll提供的高效网络套接字轮询服务。但是,在并发连接不高的情况下,多线程+阻塞I/O方式可能性能更好。既然select,poll,epoll都是I/O多路复用的具体的实现,之所以现在同时存在,其实他们也是不同历史时期的产物:select出现是1984年在BSD里面实现的。原创 2024-09-09 21:51:38 · 680 阅读 · 0 评论 -
线程的创建Linux下
进程的创建:第一个参数通常传递一个pthread_t 的地址,第二个参数为线程的属性,第三个参数为函数指针,是子线程要做的事情。sleep主要是为了等待子线程退出,因为当主线程退出时,子线程将没有进程空间,子线程自然无法运行。因为t是存储在子线程的栈中的,所以上述代码应该将t定义为全局变量或者是静态变量。,可以避免僵尸线程状态和资源泄露,确保线程资源在子线程终止后得到正确处理。线程退出是指将调用该函数的线程退出,但是不会导致此空间释放。来等待子线程结束,并获取其退出状态。内核负责标记和回收子线程的资源。原创 2024-08-01 11:15:43 · 163 阅读 · 0 评论 -
信号量的实例
/最后一个成员通常被设置为SEM_UNDO,使得操作系统跟踪当前进程的信号量修改情况,如果进程在没有使用该信号量的情况下终止掉,那么操作系统会自动释放该进程持有的信号量。cmd通常有两个最常用的值,SETVAL,IPC_RMID,SETVAL表示把信号量初始化一个已知的值,IPC_RMID表示删除无需再使用的信号量。key的作用是一个整数值,不相关的进程可以通过他访问同一个信号量。semid是第一个函数返回的信号量描述符,类似于文件描述符。该函数的作用是创建一个新的信号量或者是获取一个信号量。原创 2024-07-26 19:28:57 · 355 阅读 · 0 评论 -
epoll的原理
原创 2024-07-25 17:53:59 · 163 阅读 · 0 评论 -
select、poll、epoll的区别
1. SELECT的机理以及缺陷:1. SELECT的机理以及缺陷:poll函数实现的机理:1.在调用select函数时,第二个参数为&read_fds,这个参数实际上就是左侧图中的bitmap,总共有1024位,CPU会将该bitmap从用户态拷贝到内核态,由内核去判断是否有就绪事件的发生。2.在判断过程中,调用select函数的进程会处于阻塞状态,当客户端给服务端发来数据时,会拷贝到数据的接收队列中,当接收队列中有数据时,会唤醒相应的进程。原创 2024-07-25 17:10:43 · 732 阅读 · 0 评论 -
粘包和半包
原创 2024-07-24 21:21:04 · 141 阅读 · 0 评论 -
epoll的实现
首先在epoll_create()会创建一个file事例,通过private_data创建eventpoll实例,当增删改时,会对rbr进行操作,rdllist存储的是就绪的事件。2.epoll在epoll_wait()函数中,struct epoll_event *events参数只带出就绪事件。红黑树在比较的时候,会按照文件地址进行比较,如果地址相同则比较文件描述符,因为相同地址的文件会有不同的文件描述符。1.epoll在内核里维护了一颗红黑树,减少了在用户态和内核态之间数据的拷贝。原创 2024-07-24 20:41:00 · 238 阅读 · 0 评论 -
阻塞IO和非阻塞IO【多路复用】
从标准输入读上数据,通过write将数据从网卡发送到服务器接收,夫区其发来的数据通过网卡传递到接收缓冲区,客户端来读取数据。fgets和read函数默认状态下都为阻塞状态,因此当fgets处于阻塞状态时,即使read对应的接收缓冲区有数据时,也不会读到。IO阻塞:例如在socket中,接收内核缓冲区内没有数据时,read将会处于阻塞状态,阻塞的程序将会被挂起。IO复用将标准输入、输出、套接字等都看作IO的一路,无论哪一路有事件发生时都会通知应用程序取处理相应的事件。磁盘io、网络io、标准输入输出。原创 2024-07-24 19:53:30 · 439 阅读 · 0 评论 -
C++生产者消费者模式(条件变量和互斥锁)
条件变量的wait操作:先释放互斥锁,将其放入互斥变量的等待队列中,等待其他线程唤醒,再放入互斥锁的等待队列中去获得锁进行操作。原创 2024-04-15 17:05:01 · 370 阅读 · 0 评论 -
系统监测工具-tcpdump的使用
因为该同步报文段是从客户端IP地址和端口号到服务器IP地址和端口号这个传输方向上的第一个TCP报文段,所以这个序号值也就是此次通信过程中该传输方向的ISN值。并且,因为这是整个通信过程中的第一个TCP报文段,所以它没有针对对方发送来的TCP报文段的确认值(尚未收到任何对方发送来的 TCP 报文段)。因为这是一次 TCP 通信的第一个 TCP报文段,所以它针对对方的时间戳的应答为0(尚未收到对方的时间戳)。因为这是一个同步报文段,所以win值反映的是实际的接收通告窗口大小。一个简单的tcpdump抓包过程。原创 2024-04-07 01:58:23 · 823 阅读 · 3 评论 -
TCP挥手中TIME_WAIT存在的原因
新的化身可能接收到属于原来的连接的、携带应用程序数据的TCP报文段(迟到的报文段),这显然是不应该发生的。另外,因为TCP报文段的最大生存时间是MSL,所以坚持2MSL时间的TIMEWAIT状态能够确保网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失(被中转路由器丢弃)。因此,一个连接的新的化身可以在2MSL时间之后安全地建立,而绝对不会接收到属于原来连接的应用程序数据,这就是TIMEWAIT状态要持续2MSL时间的原因。2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。原创 2024-04-06 21:35:33 · 353 阅读 · 0 评论 -
epoll函数的剖析
events 参数是一个用户数组,这个数组仅仅在 epoll_wait 返回时保存内核检测到的所有就绪事件,而不像 select 和 poll 的数组参数那样既用于传入用户注册的事件,又用于输出内核检测到的就绪事件。timeout 参数指定超时时间,单位为毫秒,如果 timeout 为 0,则 epoll_wait 会立即返回,如果 timeout 为-1,则 epoll_wait 会一直阻塞,直到有事件就绪。epoll_wait()成功返回就绪的文件描述符的个数,失败返回-1,超时返回 0。原创 2024-03-05 17:11:57 · 445 阅读 · 0 评论 -
select函数
首先将文件描述符放到文件描述符集合当中,select去检测是否有事件发生,调用select产生返回值,返回值大于0代表有事件发生,去处理该事件,在处理事件时也可能加入新的文件描述符。maxfd 参数指定的被监听的文件描述符的总数。它通常被设置为 select 监听的所有文件描述符中的最大值+1,readfds、 writefds 和 exceptfds 参数分别指向可读、可写和异常等事件对应的文件。需要指出的是, I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。如果要提高并发处理的能力,可以。原创 2024-03-05 11:41:52 · 324 阅读 · 0 评论 -
同步和异步
所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,"调用"在发出之后,这个调用就直接返回了,所以没有返回结果。同步——如果使用者在服务运行的过程中阻塞时崩溃了,当它重新启动时,将无法重新连接到正在进行的调用,所以响应丢失了。异步——如果使用者在发送了请求之后等待响应时崩溃了,当它重新启动时,可以继续等待响应,所以响应不会丢失。2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)原创 2024-03-04 00:05:20 · 310 阅读 · 0 评论 -
Libevent的使用及reactor模型
支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;libevent的流程可以分为三步:定义框架,注册事件,启动事件循环(epoll检测事件是否发生,发生的时候,通知子线程调用回调函数//此过程会阻塞)下图为编写的框架。事件源可以理解为我们的文件描述符,多路复用机制是我们的IO模型(select,poll,epoll),事件处理程序理解为回调函数。Reactor:事件源(描述符)、Reactor 框架、多路复用机制和事件处理程序。原创 2024-03-03 21:23:10 · 691 阅读 · 0 评论 -
fork函数,僵死进程
fork复制进程以及僵死进程原创 2023-05-28 17:13:37 · 209 阅读 · 0 评论