百万并发设计

              百万并发架构

一 单个机器的并发

  1. Linux系统系统级的最大文件描述符

      1.1 系统级最大文件描述符

理论上系统内存有多大就能打开多少的文件描述符,实际上内核会处理,一般最大打开文件数是系统内存的10%(以KB来计算),比如16G的内存,最大文件数大约是16*1000*1000*10%=1.6million, 可以通过 cat /proc/sys/fs/file-max 或者 sysctl -a | grep fs.file-max 命令查看

      1.2 更改系统级限制有临时更改和永久更改两种方式:

临时更改:session断开或者系统重启后会恢复原来的设置值。使用命令 sysctl -w fs.file-max=xxxx,其中xxxx就是要设置的数字。

永久更改:vim编辑 /etc/sysctl.conf 文件,在后面添加 fs.file-max=xxxx,其中xxxx就是要设置的数字。保存退出后还要使用sysctl -p 命令使其生效。

      2.Linux系统用户级的最大文件描述符

     2.1 用户级最大文件描述符

同时为了控制每个进程消耗的文件资源,内核也会对单个进程最大打开文件数做默认限制,即用户级限制。32位系统默认值一般是102464位系统默认值一般是65535,可以使用 ulimit -n 命令查看。

      2.2 更改用户级限制也有临时更改和永久更改两种方式:

临时更改:session断开或者系统重启后会恢复原来的设置值。使用命令 ulimit -SHn xxxx 命令来修改,其中xxxx就是要设置的数字。

永久更改:vim编辑 /etc/security/limits.conf 文件,修改其中的 hard nofile xxxx  soft nofile xxxx,其中xxxx就是要设置的数字。保存后退出。关于hardsoft的区别,参照下面参考链接中的第5个。

     3. Nginx并发数

nginx官方说nginx能支撑6万多并发性能最好,那么这里我们设置nginx进程最大能打开60,000fd,假如是4核的CPU(内存我们假设足够大32G64G等等),我们设置worker数量为4,那么worker_connection数量为15,000。那么nginx对外能提供多少并发数呢?你以为是60,000?那么你答错了,因为nginx作为反向代理,一个用户的请求实际上占了2fd,一个fd是用户请求,一个fd是连接后台服务的。所以一个nginx在我们这样配置参数下,可以支持30,000并发

     4. tomcat并发数

      4.1 acceptCount 最大连接数

默认是100。当http请求数达到tomcat的最大线程数时,还有新的http请求到来,tomcat会把请求数放到队列中。acceptCount就是最大的等待数,超过这个,tomcat会拒绝。

      4.2 maxThreads最大线程数

每一个HTTP请求,tomcat都会创建一个线程来处理请求,最大线程数决定了tomcat能同时处理多少个请求。默认是200

       4.3 maxConnections最大连接数

同一时间能接受的最大连接数。

        4.4 最大并发

响应时间在50ms,则每个线程1秒可以处理20个请求,tps20*maxThreads

        5 数据库

数据库的最大连接数。SHOW GLOBAL STATUS LIKE '%max _connections%'

        6 Dubbo

Dubbo的默认线程是200.

        7 Redis

Redis的默认线程是10000.

        8 Jedis

JedismaxActive8.修改为1000.

综上所述,单个机器的默认并发200,通过配置,增加tomcatdubbo的线程数可以达到1000并发

二 百万并发

  1. 2LVS集群(一主一备+keepalived
  2. nginx30000并发,40nginx服务器
  3. tomcat1000并发,1000tomcat服务器,实际上大部分场景不可能每秒都是1百万并发。比如10秒有100万个请求,实际上可以用kafka接受,然后分摊到每秒10万个请求,这样tomcat需要100台机器可以满足需求

你可能感兴趣的:(Java,Nginx,linux,服务器,运维,架构)