在 Linux 平台上运行的进程都会从系统资源申请一定数量的句柄,而且系统控制了进程能够申请的最大句柄数量。用户程序如果不及时释放无用的句柄,将会引起句柄泄露,从而可能造成申请资源失败,导致系统文件句柄用光连接不能建立。本文主要介绍Linux下如何查看和修改进程打开的文件句柄数,避免这类问题的发生。
ERROR 1040(HY000): Too many connections:DB连接池里已有太多连接,不能再和你建立新连接。
Linux内核是高并发服务的关键组件之一。以下是一些可用于优化Linux内核的配置。
可以发现,很明显是Nginx返回的错误。但是从接口返回看不出太多的细节问题,需要打印nginix日志查看
在一个工作中的实践项目中,项目是一个部署到linux下的中间件项目,当收到一个Client登录的时候,需要为这个Client打开四个文件,当进行 多用户的大压力测试的时候,程序就出问题了: too many opened files。 网上一查,发现有人也碰到过类似的socket/File: Can’t open so many files问题。 在此总结一下这个问题,希望对后来之人有点帮助。
最近遇到一个非常有趣的问题。其中有一组HAProxy,频繁出现问题。登录上服务器,cpu、内存、网络、io一顿猛查。最终发现,机器上处于TIME_WAIT状态的连接,多达6万多个。
查看系统默认的最大文件句柄数,系统默认是1024 #ulimit -n 1024
网上说什么的也有,你抄我的我抄你的,也是醉了,故自己综合查阅的资料,根据自己的理解和判断以及部分的实践整理下吧,也不敢保证都是对的,如果有比较大的错误,希望看到这篇文章的你提出来,大家共同进步!
1.概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦。在Linux操作系统中,文件句柄(包括Socket句柄)、打开文件、文件指针、文件描述符的概念比较绕,而且windows的文件句柄又与此有何关联和区别?这一系列的问题是我们不得不面对的。 这里先笼统的将一下自己对上面的问题的一些理解: 句柄,熟悉Windows编程的人知道:句柄是Windows用来标识被应用程序
Redis的高性能和他的事件模型是密不可分的,最大程度上利用了单线程、非阻塞IO模型来快速的处理请求(单线程处理多链接)。这里存在一个问题,其实严格意义上来讲,Redis 是单线程对外提供服务,redis内部并不单线程的,还存在一些关于数据持久化的线程。
“too many open files”这个错误大家经常会遇到,因为这个是Linux系统中常见的错误,也是云服务器中经常会出现的,而网上的大部分文章都是简单修改一下打开文件数的限制,根本就没有彻底的解决问题。
为了让系统能够支持更大的并发,除了必须安装event扩展之外,优化linux内核也是重中之重。
在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。
无论对Spark集群,还是Hadoop集群等大数据相关的集群进行调优,对linux系统层面的调优都是必不可少的,这里主要介绍3种常用的调优:
IO多路复用技术把多个IO的阻塞复用到同一个select的阻塞上,使得系统在单线程的情况下可以同时处理多个客户端请求。
为了让系统能够支持更大的并发,除了必须安装event扩展之外,优化linux内核也是重中之重,以下优化每一项都非常非常重要,请务必按逐一完成。
首先我们来看如何标识一个TCP连接?系统是通过一个四元组来识别,(src_ip,src_port,dst_ip,dst_port)即源IP、源端口、目标IP、目标端口。比如我们有一台服务192.168.0.1,开启端口80.那么所有的客户端都会连接到这台服务的80端口上面。有一种误解,就是我们常说一台机器有65536个端口,那么承载的连接数就是65536个,这个说法是极其错误的,这就混淆了源端口和访问目标端口。我们做压测的时候,利用压测客户端,这个客户端的连接数是受到端口数的限制,但是服务器上面的连接数可以达到成千上万个,一般可以达到百万(4C8G配置),至于上限是多少,需要看优化的程度。具体做法如下:
说这个问题是在是惭愧, 到底为什么惭愧结尾说, 事情是MYSQL 8.011 的一些机器的max_connections 经常被改为214, 而明明我们的设置的是2000的最大连接数, 但过一段时间就会被改为214.
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 epoll的相关系统调用 epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 1. int ep
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发 数 量都要受到系统对用户单一进程同时可打开文件数量的 限制(这是因为系统为每个TCP连接都要创 建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当 前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同 时打开1024个文件,这1024个文件中还得除去每个进
在Linux系统内默认对所有进程打开的文件数量有限制(也可以称为文件句柄,包含打开的文件,套接字,网络连接等都算是一个文件句柄)
Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。
Oracle 不同平台的数据库安装指导为我们部署Oracle提供了一些系统参数设置的建议值,然而建议值是在通用的情况下得出的结论,并非能完全满足不同的需求。使用不同的操作系统内核参数将使得数据库性能相差甚远。本文描述了linux下几个主要内核参数的设置,供参考。
如果在 Swoole 的日志中遇到了 Too many open files 这种报错,不要慌,在开发 TCP 网络应用的过程中,经常会遇到Too many open files这个问题。
建议每小时或者每天备份,如果数据极其重要,可以5~10分钟备份一次。备份可以通过定时任务复制元数据目录即可。
通常的分析手法如下(转自:https://blog.csdn.net/xiaolli/article/details/56012228): (1). 确定是哪类文件打开太多,没有关闭.
本文出自:[url]http://www.nsfocus.com[/url] 维护:小四 6. /etc/system可调资源限制 6.1 Solaris下如何限制每个用户可拥有的最大进程数 6.2 如何配置系统使之支持更多的伪终端 6.3 如何增加每个进程可打开文件句柄数 6.4 6.5 做了setuid()这类调用的程序如何产生core dump 6.6 消息队列调整 -------------------------------------------------------------------------- 6. /etc/system可调资源限制 6.1 Solaris下如何限制每个用户可拥有的最大进程数 A: Casper Dik 在/etc/system设置 set maxuprc = Q: maxusers参数究竟影响了什么 A: Casper Dik 下面以/etc/system语法格式举例说明: * set maxusers = <以MB为单位计的可用物理内存数量> * 系统所允许的最大进程数,通常最多30000 set max_nprocs = 10 + 16 * maxusers * 每个用户可以拥有的最大进程数(为超级用户保留5个) set maxuprc = max_nprocs - 5; # sysdef | sed -n '/System Configuration/,$p' 6.2 如何配置系统使之支持更多的伪终端 A: Argoth 不要试图通过'/usr/bin/adb -k'到达目的。 a. 如果Solaris版本小于7,修改/etc/system,增加如下行 set pt_cnt= 执行/usr/sbin/reboot -- -r,或者Stop-A,执行boot -r b. 对于Solaris 8,支持的伪终端数目根据需要动态改变,系统依然有一个内部限制, 但是这个值非常大。如果"pt_cnt"变量小于这个内部限制,将被忽略。一般情况 下,不再需要指定"pt_cnt"变量。但还是有某些罕见的情形,需要设置"pt_cnt" 变量大于内部限制。 6.3 如何增加每个进程可打开文件句柄数 A: Casper Dik 从Solaris 2.4开始,可以通过修改/etc/system实现 * set hard limit on file descriptors set rlim_fd_max = 4096 * set soft limit on file descriptors set rlim_fd_cur = 1024 软限制超过256时,某些应用程序会出问题,尤其BCP程序。软限制超过1024时,那些 使用select()的应用程序可能会出问题。Solaris 7之前,select()使用的文件句柄 数不能超过1024。Solaris 2.6的RPC代码被重写过了,使用poll()代替select(),可 以使用超过1024的文件句柄。Solaris 2.6之前,如果软限制超过1024,所有RPC服务 很可能崩溃。 Solaris 7下select()可以使用最多达65536的文件句柄,64-bit应用程序缺省情况如 此。如果是32-bit应用程序,需要指定给FD_SETSIZE一个更大的值,重新编译。 如果程序使用标准输入/输出(stdio),或者调用那些使用stdio的库函数,当打开的 文件超过256时,程序可能会出问题,这个限制是stdio的限制。当程序需要大量文件 句柄时,应该想办法保留一些小数字的文件句柄,让stdio使用它们。 Solaris 7下64-bit应用程序不再受这个stdio限制的影响。如果你的确需要超过256 个FILE *,而又不能使用Solaris 7,或者需要运行32-bit代码,考虑使用来自AT&T 的SFIO([url]http://www.research.att.com/sw/tools/sfio/[/url])。 A: [email]qaz@smth.org[/email] 检查当前设置 # ulimit -H -n 1024 # ulimit -S -n 64 # 对于Solaris,建议修改/etc/system后重启 * set hard limit on file descriptors set rlim_fd_max=0x8000 * set soft limit on file descriptors set rlim_fd_cur=0x8000 然后 ulimit -S -n 8192 对于Linux echo 65536 > /proc/sys/fs/file-max 然后 ulimit -S -n 8192 对于FreeBSD 编辑/etc
epoll简介 epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。 [cpp]
Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量 系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制. /proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量 linux 中数据的含义 /proc/sys/fs/file-nr [root@localhost logs]# cat /proc/sys/fs/fi
select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。
网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?
nginx系列之一:nginx入门 nginx系列之二:配置文件解读 nginx系列之三:日志配置 nginx系列之四:web服务器 nginx系列之五: 负载均衡 nginx系列之六:cache服务 nginx系列之七:限流配置 nginx系列之八:使用upsync模块实现负载均衡
1、Linux服务器程序一般以后台进程形式运行,也就是以daemon守护进程的方式,守护进程的父进程通常是init进程(PID进程为1),作者在7.6 服务程序后台化给出了一个程序的清单,还是很有参考意义的。后台进程形式运行,也就是通过fork一个子进程,结束父进程的方式运行,这样避免很多前台启动,随着操作终端界面的关闭而结束服务器程序的运行;
Tips : OOM(Out Of Memory) killer机制是指Linux操作系统发现可用内存不足时,强制杀死一些用户进程(非内核进程),来保证系统有足够的可用内存进行分配。 Tips : swappiness参数在Linux 3.5版本前后的表现并不完全相同,Redis运维人员在设置这个值需要关注当前操作系统的内核版本。
我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd(file descriptor)、一个fd就是一个整数、所以对这个整数的操作、就是对这个文件(流)的操作、我们创建一个socket、通过系统调用会返回一个文件描述符、那么剩下对socket的操作就会转化为对这个描述符的操作、不能不说这又是一种分层和抽象的思想、
同步阻塞IO在等待数据就绪上花去太多时间,而传统的同步非阻塞IO虽然不会阻塞进程,但是结合轮询来判断运维
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。 文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。 程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。标准文件描述符图如下:
好久没写 Node.js 故障案例了,今天是一枚全新的进程假死无响应案例。 特点是完全不同于之前常规遇到的类死循环引发的阻塞假死,值得记录分析的过程,希望对遇到其它的类似案例的开发者有所启发。
单台服务器可以支持的并发TCP连接数取决于多个因素,包括硬件性能、操作系统限制、网络带宽和应用程序设计。以下是一些影响并发TCP连接数的因素:
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。
之所以写这篇文章也是因为前几天出的一个问题,当时业务感觉到卡顿,并且伴随着锁超时的报错。最后通过分析发现是由于磁盘I/Q繁忙导致SQL耗时增加,部分锁竞争激烈的热数据出现了锁等待和锁超时。由此可见,系统的硬件环境对数据库整体性能的影响也是非常大的,MySQL在运行环境中并不是孤立存在的,它的整体性能往往受限于系统最薄弱的环节,今天想和大家分享下,都有哪些系统指标会对数据库的整体性能产生影响,我们又如何进行分析。
Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts ,适合用来做mongrel clusters的前端HTTP响应。 nginx和Apache一样使用模块化设计,nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。
Linux的核心思想之一就是”一切皆文件”。即Linux中所有的内容都是以文件的形式保存和管理的,它为不同类型的文件提供了统一的操作接口,对于不同类型的文件,我们都可以使用fopen()/fclose()/fwrite()/fread()等对这些文件进行读写处理。在Linux中,普通文件、目录、链接文件、字符设备、块设备以及网络套接字等等都以文件的形式存在。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
步骤: 1、--查看当前各个进程打开的文件句柄数,其结果的第一列表示句柄数,第二列表示进程号 lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more 2、--查看单个进程能够打开的最大文件句柄数量(socket连接也算在里面) ulimit -n 3、对比1和2的结果,如果1接近或超过2了,需要将2的配置调大 ulimit -n <最大文件句柄数> 4、如果想知道打开的文件句柄数最多的进程是哪个应用程序,可以使用如下命令 ps -aef|grep <进程号> 5、如果句柄数调的非常大了,还是不行,可能需要看看/proc/sys/fs/file-max中的值,该值表示系统全局的可用句柄数,可修改 vim /proc/sys/fs/file-max 6、对于正在使用(分配出去)的所有的句柄数、未使用的所有的句柄数、可使用的最大的句柄数这3个值,可以通过以下只读文件查看 vim /proc/sys/fs/file-nr 提示:当分配出去的句柄数接近最大句柄数,而“未使用的句柄数”远大于零时,表明你遇到了一个“句柄”使用高峰,这意为着你不需要增加file-max的值。 原文如下: When the allocated file handles come close to the maximum, but the number of unused file handles is significantly greater than 0, you’ve encountered a peak in your usage of file handles and you don’t need to increase the maximum.
当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨
中文地址: https://www.oschina.net/translate/c10k
领取专属 10元无门槛券
手把手带您无忧上云