我看到在一个基于Linux的机器上load average: 12.41, 11.94, 11.59平均负载平均负载时间为load average: 12.41, 11.94, 11.59 。 它有16个核心,所以平均负载不是很难。
但是,当我尝试连接到这个Web应用程序时,经常会超时。 什么可能导致这个? 这是一个曲线球。
所有CPU的CPU使用率徘徊在约50%左右(根据top )。 wa值在0.0到3.0之间。 根本没有使用交换内存,并有大量的空闲内存可用。
iostat显示0.51的%iowait值。 其他数据是:
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 4.88 1.02 2136.25 12365497 25895371840 sdb 0.00 0.00 0.00 9456 0 sdc 0.95 0.00 452.44 4781 5484405440
写/秒高 – 这是一个写/重的应用程序。 iotop显示来自pgbouncer进程(postgresql连接池),asynchronous任务队列和nginx工作进程(可能写入访问日志)的写入。 在IO>列中我没有看到6%以上的东西 – 大部分行都有0.00%。 SWAPIN是0.00% 。
总之,CPU利用率不是通过屋顶,内存利用率不是问题,并没有过多的I / O相关的等待进行的迹象。 当我尝试访问它时,为什么Web应用程序会无限加载/超时? 这可能是在sysctl.conf或我的networking服务器的问题? 这里需要专家意见。
有问题的服务器是Ubuntu 14.04 LTS。 Nginx是一个web服务器,用作Gunicorn(基于Django的web应用程序)的反向代理。 后端是Postgresql 9.3,Redis也在使用。 数据库驻留在单独的虚拟机中。
如果您正在处理大量的TCP连接,并且正在经历像nginx这样的反向代理,那么您可能遇到TCP端口耗尽 。 总之,理论上有65535个TCP端口。 如果您有一个来自IP 192.168.1.1的反向代理连接到192.168.1.2:80端口80上的Web服务器,那么您可以通过65535的反向代理将理论上的最大并发连接数量设置为80服务器。 之后,您将用尽源端口(称为临时端口)。
但是比这更复杂一点:Linux默认情况下只能使用这些端口的大约30000(较低的内核/发行版 – 低至1024),即使这样,它也会使用随机尝试查找免费源码端口使用。 越接近30000标记,内核随机select一个空闲端口的尝试就越多,find一个空闲端口的时间就越长。 尝试使用netstat,grep和wc来计算你拥有的连接数量,如果你接近30,000,这可能是你超时的原因。 如果是这样的话,您可以查看NGINX对解决这个问题的build议。