docker network performance reduce by nat module & kvm vs docker vs localhost

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
公网NAT网关,每月750个小时 15CU
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
在测试docker下postgresql性能时, 发现的一个DNAT转换后的网络性能问题.

首先附上KVM,DOCKER,本机的几组测试数据(测试数据仅供参考, 有兴趣的朋友可以自己测试一下) : 
注意在测试连接超出物理核心数后, docker的性能开始严重下降. (可能有优化手段解决这个问题) 
TPS                      16连接IP,             16连接UNIX SOCK,  48连接UNIX SOCK,  96连接UNIX SOCK
docker DNAT               29662
docker                    174089.814292          257437.255033    265112.234836     180037.521722 
kvm                       58692.023756           62217.477740     166212.113952     162729.867472 
本机                      185341.577666          271232.160555    335530.912484     303621.978815


宿主机内核 : 
[root@db-172-16-3-221 ~]# uname -r
2.6.32-431.el6.x86_64

docker版本 : 
[root@db-172-16-3-221 ~]# docker info
Containers: 1
Images: 99
Storage Driver: devicemapper
 Pool Name: docker-8:49-17826869-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1455.9 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 3.4 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 2.6.32-431.el6.x86_64

本地的images如下 : 
[root@db-172-16-3-221 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
postgres            9.4-beta3           68b6ddf9ca08        47 hours ago        213.6 MB
postgres            9.4                 68b6ddf9ca08        47 hours ago        213.6 MB
postgres            9                   935836384c52        47 hours ago        212.9 MB
postgres            latest              935836384c52        47 hours ago        212.9 MB
postgres            9.3                 935836384c52        47 hours ago        212.9 MB
postgres            9.3.5               935836384c52        47 hours ago        212.9 MB
postgres            9.2                 2a9ab0b9fa56        47 hours ago        212.7 MB
postgres            9.2.9               2a9ab0b9fa56        47 hours ago        212.7 MB
postgres            9.1.14              ee60947f6805        47 hours ago        212.1 MB
postgres            9.1                 ee60947f6805        47 hours ago        212.1 MB
postgres            9.0.18              f29be88283f6        47 hours ago        211.5 MB
postgres            9.0                 f29be88283f6        47 hours ago        211.5 MB
postgres            8                   c57c14beb696        47 hours ago        211 MB
postgres            8.4.22              c57c14beb696        47 hours ago        211 MB
postgres            8.4                 c57c14beb696        47 hours ago        211 MB
postgres            9.4-beta2           bf872395e1d4        2 weeks ago         213.6 MB

我们可以看看一个image的网络配置 :
[root@db-172-16-3-221 ~]# docker inspect postgres:9.3.5
[{
    "Architecture": "amd64",
    "Author": "",
    "Comment": "",
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "postgres"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": [
            "/docker-entrypoint.sh"
        ],
        "Env": [
            "PATH=/usr/lib/postgresql/9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=en_US.utf8",
            "PG_MAJOR=9.3",
            "PG_VERSION=9.3.5-1.pgdg70+1",
            "PGDATA=/var/lib/postgresql/data"
        ],
        "ExposedPorts": {
            "5432/tcp": {}
        },
        "Hostname": "39d2c877bc4f",
        "Image": "15d042248df39ca896223c9e75f0f4541996f2b52030f1f8e6619cf18f77e395",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": [],
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": {
            "/var/lib/postgresql/data": {}
        },
        "WorkingDir": ""
    },
    "Container": "977043cde52cd15e070d71a67fbd8e2ec908af49123f3f773f71cda2061e9f44",
    "ContainerConfig": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) CMD [postgres]"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": [
            "/docker-entrypoint.sh"
        ],
        "Env": [
            "PATH=/usr/lib/postgresql/9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=en_US.utf8",
            "PG_MAJOR=9.3",
            "PG_VERSION=9.3.5-1.pgdg70+1",
            "PGDATA=/var/lib/postgresql/data"
        ],
        "ExposedPorts": {
            "5432/tcp": {}
        },
        "Hostname": "39d2c877bc4f",
        "Image": "15d042248df39ca896223c9e75f0f4541996f2b52030f1f8e6619cf18f77e395",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": [],
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": {
            "/var/lib/postgresql/data": {}
        },
        "WorkingDir": ""
    },
    "Created": "2014-10-21T05:54:39.659381225Z",
    "DockerVersion": "1.2.0",
    "Id": "935836384c524aafc0ac1c05246002c9c93343f0b4283a34e77a5f92f97f9a7c",
    "Os": "linux",
    "Parent": "15d042248df39ca896223c9e75f0f4541996f2b52030f1f8e6619cf18f77e395",
    "Size": 0
}

启动一个container, 使用-P将端口映射出来.
[root@db-172-16-3-221 ~]# docker run -d -P postgres:9.3.5
[root@db-172-16-3-221 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
786d815d71b0        postgres:9          /docker-entrypoint.s   2 hours ago         Up 2 hours          0.0.0.0:49155->5432/tcp   suspicious_wright   


这个时候会自动创建nat转换条目, 可以使用iptables-save命令查看, 如下有一台DNAT的规则是端口49155的转发 : 
[root@db-172-16-3-221 ~]# iptables-save
# Generated by iptables-save v1.4.7 on Thu Oct 23 14:00:48 2014
*nat
:PREROUTING ACCEPT [109:52442]
:POSTROUTING ACCEPT [90:4680]
:OUTPUT ACCEPT [90:4680]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER 
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE 
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE 
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER 
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 49155 -j DNAT --to-destination 172.17.0.4:5432 
COMMIT
# Completed on Thu Oct 23 14:00:48 2014


同时查看这个container的网络, 也就是说, 外部可以通过宿主机的 49155  端口访问这个container的postgresql数据库.
宿主机本地则可以通过127.0.0.1: 49155  或 172.17.0.4:5432来访问.
问题来了 : 
通过nat访问的性能和直接访问的性能差太多了.

   "NetworkSettings": {
        "Bridge": "docker0",
        "Gateway": "172.17.42.1",
        "IPAddress": "172.17.0.4",
        "IPPrefixLen": 16,
        "PortMapping": null,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "49155"
                }
            ]
        }

详细 : 
[root@db-172-16-3-221 ~]# docker inspect 786d815d71b0
[{
    "Args": [
        "postgres"
    ],
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "postgres"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": [
            "/docker-entrypoint.sh"
        ],
        "Env": [
            "PATH=/usr/lib/postgresql/9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=en_US.utf8",
            "PG_MAJOR=9.3",
            "PG_VERSION=9.3.5-1.pgdg70+1",
            "PGDATA=/var/lib/postgresql/data"
        ],
        "ExposedPorts": {
            "5432/tcp": {}
        },
        "Hostname": "786d815d71b0",
        "Image": "postgres:9.3.5",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": null,
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": {
            "/var/lib/postgresql/data": {}
        },
        "WorkingDir": ""
    },
    "Created": "2014-10-23T02:51:06.152941964Z",
    "Driver": "devicemapper",
    "ExecDriver": "native-0.2",
    "HostConfig": {
        "Binds": null,
        "ContainerIDFile": "",
        "Dns": null,
        "DnsSearch": null,
        "Links": null,
        "LxcConf": [],
        "NetworkMode": "bridge",
        "PortBindings": {},
        "Privileged": false,
        "PublishAllPorts": true,
        "VolumesFrom": null
    },
    "HostnamePath": "/var/lib/docker/containers/786d815d71b0dca10042e73842634483158811a9c54509e58d7a1d2afa6fd94d/hostname",
    "HostsPath": "/var/lib/docker/containers/786d815d71b0dca10042e73842634483158811a9c54509e58d7a1d2afa6fd94d/hosts",
    "Id": "786d815d71b0dca10042e73842634483158811a9c54509e58d7a1d2afa6fd94d",
    "Image": "935836384c524aafc0ac1c05246002c9c93343f0b4283a34e77a5f92f97f9a7c",
    "MountLabel": "",
    "Name": "/suspicious_wright",
    "NetworkSettings": {
        "Bridge": "docker0",
        "Gateway": "172.17.42.1",
        "IPAddress": "172.17.0.4",
        "IPPrefixLen": 16,
        "PortMapping": null,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "49155"
                }
            ]
        }
    },
    "Path": "/docker-entrypoint.sh",
    "ProcessLabel": "",
    "ResolvConfPath": "/etc/resolv.conf",
    "State": {
        "ExitCode": 0,
        "FinishedAt": "0001-01-01T00:00:00Z",
        "Paused": false,
        "Pid": 22251,
        "Running": true,
        "StartedAt": "2014-10-23T02:51:06.931436989Z"
    },
    "Volumes": {
        "/var/lib/postgresql/data": "/var/lib/docker/vfs/dir/8df8643eb4f255471b744a957a168fb9e1e57b1169ade6fba8b5f3a912681e88"
    },
    "VolumesRW": {
        "/var/lib/postgresql/data": true
    }
}


这个启动container后为container创建的接口.
# ifconfig
veth2d30  Link encap:Ethernet  HWaddr 42:9B:9F:1F:09:B0  
          inet6 addr: fe80::409b:9fff:fe1f:9b0/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:6289977 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6290136 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:786242516 (749.8 MiB)  TX bytes:597549874 (569.8 MiB)
[root@db-172-16-3-221 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.429b9f1f09b0       no              veth2d30


测试如下, 执行select 1; : 
[root@db-172-16-3-221 ~]# cd
[root@db-172-16-3-221 ~]# psql -V
psql (PostgreSQL) 9.3.5
[root@db-172-16-3-221 ~]# vi test.sql
select 1;

通过NAT转换的性能 : 
[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h 127.0.0.1 -p 49155 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 889901
tps = 29662.517330 (including connections establishing)
tps = 29677.580497 (excluding connections establishing)
statement latencies in milliseconds:
        0.537902        select 1;

直接连接container访问的性能 : 
显然使用nat转换带来的性能损失非常大, TPS下降到了17%.

[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h 172.17.0.4 -p 5432 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 5222786
tps = 174089.814292 (including connections establishing)
tps = 174177.646184 (excluding connections establishing)
statement latencies in milliseconds:
        0.090595        select 1;

另外 , 附上直接访问宿主机本地的数据库的性能, 我们看到docker性能损失极少(约6%) : 
相比KVM虚拟化, CPU损耗方面, DOCKER的性能损耗确实非常低, KVM参考 : 

[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h 127.0.0.1 -p 5432 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 5560383
tps = 185341.577666 (including connections establishing)
tps = 185435.133589 (excluding connections establishing)
statement latencies in milliseconds:
        0.084922        select 1;

在同一台宿主机下KVM虚拟机测试结果如下(kvm VCPU=48, 宿主机48核) : 
宿主机CPU : 

processor       : 47
vendor_id       : GenuineIntel
cpu family      : 6
model           : 46
model name      : Intel(R) Xeon(R) CPU           E7540  @ 2.00GHz
stepping        : 6
cpu MHz         : 1995.262
cache size      : 18432 KB
physical id     : 3
siblings        : 12
core id         : 11
cpu cores       : 6
apicid          : 119
initial apicid  : 119
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 x2apic popcnt lahf_lm ida epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips        : 3989.44
clflush size    : 64
cache_alignment : 64
address sizes   : 44 bits physical, 48 bits virtual
power management:

4SOCKET
6CORE
2TH

共48核心
虚拟机CPU(问题可能出自这里) : 

processor       : 47
vendor_id       : GenuineIntel
cpu family      : 6
model           : 26
model name      : Intel Core i7 9xx (Nehalem Class Core i7)
stepping        : 3
cpu MHz         : 1995.047
cache size      : 4096 KB
physical id     : 3
siblings        : 12
core id         : 5
cpu cores       : 6
apicid          : 59
initial apicid  : 59
fpu             : yes
fpu_exception   : yes
cpuid level     : 4
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc unfair_spinlock pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
bogomips        : 3990.09
clflush size    : 64
cache_alignment : 64
address sizes   : 44 bits physical, 48 bits virtual
power management:

KVM进程 : 
qemu     29307     1 55 15:57 ?        00:00:07 /usr/libexec/qemu-kvm -name test1 -S -M rhel6.5.0 -cpu Nehalem,+rdtscp,+x2apic,+dca,+pdcm,+xtpr,+tm2,+est,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme -enable-kvm -m 8192 -realtime mlock=off -smp 48,sockets=4,cores=6,threads=2 -uuid 073dbc6f-f376-2c96-6323-e0cc488eda68 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/test1.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/libvirt/images/test1.img,if=none,id=drive-virtio-disk0,format=raw,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=21,id=hostnet0,vhost=on,vhostfd=22 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:d6:b2:07,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0 -vnc 127.0.0.1:0 -vga cirrus -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6

KVM性能(损耗68%) : 
[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h 172.17.42.222 -p 5432 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 1760790
tps = 58692.023756 (including connections establishing)
tps = 58743.201940 (excluding connections establishing)
statement latencies in milliseconds:
        0.271061        select 1;

计算密集型的话docker有明显优势.

最后再来一组unix socket的测试结果 : 
本机 : 

[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h /data01/pgdata/pg_root -p 5432 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 8137047
tps = 271232.160555 (including connections establishing)
tps = 271348.434446 (excluding connections establishing)
statement latencies in milliseconds:
        0.057746        select 1;


docker (性能损耗5%)
[root@db-172-16-3-221 ~]# docker run -t -i postgres:9.3.5 /bin/bash
root@48f8decd3ccb:/# more docker-entrypoint.sh 
#!/bin/bash
set -e

if [ "$1" = 'postgres' ]; then
        chown -R postgres "$PGDATA"

        if [ -z "$(ls -A "$PGDATA")" ]; then
                gosu postgres initdb

                sed -ri "s/^#(listen_addresses\s*=\s*)\S+/\1'*'/" "$PGDATA"/postgresql.conf

                { echo; echo 'host all all 0.0.0.0/0 trust'; } >> "$PGDATA"/pg_hba.conf

                if [ -d /docker-entrypoint-initdb.d ]; then
                        for f in /docker-entrypoint-initdb.d/*.sh; do
                                [ -f "$f" ] && . "$f"
                        done
                fi
        fi

        exec gosu postgres "$@"
fi

exec "$@"
root@48f8decd3ccb:/# ./docker-entrypoint.sh postgres
root@48f8decd3ccb:/# echo "select 1;" > ./test.sql
root@48f8decd3ccb:/# pgbench -M prepared -n -r -f ./test.sql -h /var/run/postgresql -p 5432 -U postgres -c 16 -j 4 -T 30 postgres   transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 7723173
tps = 257437.255033 (including connections establishing)
tps = 257554.115083 (excluding connections establishing)
statement latencies in milliseconds:
        0.060943        select 1;


kvm (性能损耗77%)
postgres@localhost-> pgbench -M prepared -n -r -f ./test.sql -h /home/postgres/pgdata/pg_root -p 5432 -U postgres -c 16 -j 4 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 16
number of threads: 4
duration: 30 s
number of transactions actually processed: 1866859
tps = 62217.477740 (including connections establishing)
tps = 62248.936343 (excluding connections establishing)
statement latencies in milliseconds:
        0.254873        select 1;


加大连接后, kvm有性能提升. 但是到顶也只能达到16.6W左右, 性能损失46.4%左右.
DOCKER的话, 超出核数后性能下降严重, 在达到物理核限制极限时, 损失12.7% 左右. 
KVM加大连接(CPU使用率1200%) : 

top - 17:54:56 up 43 days,  7:58,  3 users,  load average: 4.72, 1.43, 0.53
Tasks: 1115 total,   1 running, 1114 sleeping,   0 stopped,   0 zombie
Cpu(s): 24.9%us,  0.2%sy,  0.0%ni, 74.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  99045564k total, 13146680k used, 85898884k free,   272772k buffers
Swap:  1048568k total,        0k used,  1048568k free,  9688200k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
30008 qemu      20   0 11.8g 815m 5828 S 1204.4  0.8  20:56.29 /usr/libexec/qemu-kvm -name test1 -S -M rhel6.5.0 -cpu Nehalem,+rdtsc

postgres@localhost-> pgbench -M prepared -n -r -f ./test.sql -h /home/postgres/pgdata/pg_root -p 5432 -U postgres -c 48 -j 12 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 48
number of threads: 12
duration: 30 s
number of transactions actually processed: 4988101
tps = 166212.113952 (including connections establishing)
tps = 166348.747712 (excluding connections establishing)
statement latencies in milliseconds:
        0.285856        select 1;

postgres@localhost-> pgbench -M prepared -n -r -f ./test.sql -h /home/postgres/pgdata/pg_root -p 5432 -U postgres -c 96 -j 12 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 96
number of threads: 12
duration: 30 s
number of transactions actually processed: 4885569
tps = 162729.867472 (including connections establishing)
tps = 163017.799292 (excluding connections establishing)
statement latencies in milliseconds:
        0.585876        select 1;


本地加大连接 : 
[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h /data01/pgdata/pg_root -p 5432 -U postgres -c 48 -j 12 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 48
number of threads: 12
duration: 30 s
number of transactions actually processed: 10068364
tps = 335530.912484 (including connections establishing)
tps = 335757.764533 (excluding connections establishing)
statement latencies in milliseconds:
        0.141343        select 1;

[root@db-172-16-3-221 ~]# pgbench -M prepared -n -r -f ./test.sql -h /data01/pgdata/pg_root -p 5432 -U postgres -c 96 -j 12 -T 30 postgres
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 96
number of threads: 12
duration: 30 s
number of transactions actually processed: 9113013
tps = 303621.978815 (including connections establishing)
tps = 304050.332175 (excluding connections establishing)
statement latencies in milliseconds:
        0.313762        select 1;


docker加大连接 : 
root@48f8decd3ccb:/# pgbench -M prepared -n -r -f ./test.sql -h /var/run/postgresql -p 5432 -U postgres -c 96 -j 12 -T 30 postgres 
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 96
number of threads: 12
duration: 30 s
number of transactions actually processed: 5403085
tps = 180037.521722 (including connections establishing)
tps = 180248.827373 (excluding connections establishing)
statement latencies in milliseconds:
        0.527325        select 1;

root@48f8decd3ccb:/# pgbench -M prepared -n -r -f ./test.sql -h /var/run/postgresql -p 5432 -U postgres -c 40 -j 10 -T 30 postgres 
transaction type: Custom query
scaling factor: 1
query mode: prepared
number of clients: 40
number of threads: 10
duration: 30 s
number of transactions actually processed: 7955103
tps = 265112.234836 (including connections establishing)
tps = 265278.332675 (excluding connections establishing)
statement latencies in milliseconds:
        0.147930        select 1;


[参考]

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
7月前
|
存储 Kubernetes C++
Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
当今,容器化技术已成为IT领域的热门话题,而容器编排工具是实现容器自动化部署和管理的关键。本文将比较两种主流的容器编排工具Kubernetes和Docker Swarm,并探讨它们的优缺点,以帮助你选择最适合自己的工具。
|
7月前
|
Kubernetes 调度 C++
Kubernetes vs Docker Swarm:容器编排工具的比较与选择
在当今云计算时代,容器技术的应用越来越广泛。而在众多容器编排工具中,Kubernetes和Docker Swarm是两个备受关注的竞争者。本文将深入比较这两个工具的特点、优势和劣势,帮助读者更好地选择适合自己的容器编排解决方案。
|
7月前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm了解两者特点,助力选取合适容器编排工具
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。
222 1
|
6月前
|
Docker 容器
docker network inspect 查询出来的网络的创建命令是什么
【6月更文挑战第17天】docker network inspect 查询出来的网络的创建命令是什么
84 1
|
存储 Kubernetes 负载均衡
深入探讨Docker生态系统,Docker Compose vs. Docker Swarm vs. Kubernetes:深入比较
Kubernetes适用于大规模、复杂应用程序和多云部署,具有高度可定制的部署配置和广泛的生态系统。 在选择时,还可以考虑将它们组合使用,以满足不同环境和需求。无论选择哪个工具,容器编排都将成为现代应用程序开发和部署的不可或缺的一部分。
916 0
|
7月前
|
关系型数据库 MySQL 数据库
docker 安装mysql(踩坑踩得想哭 详细解决教程)ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using pa
docker 安装mysql(踩坑踩得想哭 详细解决教程)ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using pa
646 1
|
7月前
|
PHP Docker 容器
docker基本命令network的使用以及基本命令
docker基本命令network的使用以及基本命令
49 0
|
7月前
|
KVM 虚拟化 Android开发
DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例Docker+KVM的部署
DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例Docker+KVM的部署
189 1
|
7月前
|
PHP Docker 容器
一文解读Docker 网络Network
一文解读Docker 网络Network
|
Nacos Docker 容器
解决docker启动时报‘Error response from daemon: network xxx not found‘问题
解决docker启动时报‘Error response from daemon: network xxx not found‘问题
3461 0