zoukankan      html  css  js  c++  java
  • 性能测试问题总结

    MySQL插入性能优化

    对于默认安装的mysql,进行insert插入测试,发现QPS很低
    通过iostat -x 1发现磁盘的IO很高

    SHOW VARIABLES LIKE 'sync_binlog';
    SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
    SHOW VARIABLES LIKE 'innodb_flush_method';
    SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
    SHOW VARIABLES LIKE 'innodb_io_capacity';
    

    sync_binlog:二进制日志文件binlog的刷新写入方式

    1. sync_binlog=0(默认值为0)
      表示binlog不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的(???),但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。
    2. sync_binlog=n(大于0的其他值)
      表示每进行n次事务提交,mysql主动调用文件系统,将缓存刷新到磁盘中

    innodb_flush_log_at_trx_commit:指定了 InnoDB 在事务提交后的日志写入方式

    1. innodb_flush_log_at_trx_commit=0(性能最高,安全性最差)
      log buffer 会 每秒写入到日志文件并刷写(flush)到磁盘,不受每次事务提交的影响,也就是 log buffer 的刷写操作和事务提交操作没有关系。
      在这种情况下,MySQL性能最好,但如果 mysqld 进程崩溃,通常会导致最后 1s 的日志丢失。
    2. innodb_flush_log_at_trx_commit=1(默认值,性能最差,安全性最高)
      每次事务提交时,log buffer 会被写入到日志文件并刷写到磁盘。
      这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以也最慢。
    3. innodb_flush_log_at_trx_commit=2(一般应该设置为2,折中方案)
      每次事务提交会写入日志文件,但并不会立即刷写到磁盘,日志文件会每秒刷写一次到磁盘。
      这时如果 mysqld 进程崩溃,由于日志已经写入到系统缓存,所以并不会丢失数据;在操作系统崩溃的情况下,通常会导致最后 1s 的日志丢失。

    innodb_flush_method:这个参数控制着innodb数据文件及redo og的打开、刷写模式,有以下几种设置:

    1. 默认是fdatasync,调用fsync()去刷数据文件与redo log的buffer
    2. 为O_DSYNC时,innodb会使用O_SYNC方式打开和刷写redo log,使用fsync()刷写数据文件,通常比较慢。
    3. 为O_DIRECT时,innodb使用O_DIRECT打开数据文件,使用fsync()刷写数据文件跟redo log,在Linux上使用Direct IO,可以显著提高速度,特别是在RAID系统上,避免额外的数据复制和double buffering(mysql buffering 和OS buffering)。

    innodb_buffer_pool_size:这是Innodb最重要的一个配置参数,这个参数控制Innodb本身的缓大小,也影响到,多少数据能在缓存中。建议该参数的配置在物理内存的70%-80%之间。

    innodb_io_capacity:动态调整刷新脏页的数量。默认是200,单位是页。
    该参数设置的大小取决于硬盘的IOPS,即每秒的输入输出量(或读写次数)。
    至于什么样的磁盘配置应该设置innodb_io_capacity参数的值是多少,可参考:

    动态设置(也可以在配置文件中设置)

    SET GLOBAL sync_binlog = 100;
    SET GLOBAL innodb_flush_log_at_trx_commit = 2;
    SET GLOBAL innodb_io_capacity = 2000;
    
    [mysqld]
    # 配置性能优化
    sync_binlog = 100
    innodb_flush_log_at_trx_commit = 2
    # O_DIRECT (避免双缓冲技术)
    innodb_flush_method = O_DIRECT
    # 设置为 RAM 大小的 50%-70%,不需要大于数据库的大小
    innodb_buffer_pool_size = 6G
    # 128M – 2G (不需要大于 buffer pool)
    innodb_log_file_size = 2G
    innodb_io_capacity = 2000
    

    MongoDB聚合查询性能

    TODO

    使用kafka生产者,内存增长过快,频繁full gc

    当kafka性能较差的时候,生产者可以设置批量发送,提高性能,同时可以解决内存占用过大的问题

    大数据量入库方案的优化

    场景:业务需要将大量的请求&响应消息写入mongo
    方案一:直接写入(缺点:受mongo写入限制,速度慢)
    方案二:使用队列,多线程写入(缺点:多线程并发写入容易导致mongo的资源占用忽高忽低,不稳定,表现为QPS忽高忽低)
    方案三:由于kafka写入速度更快,先将数据写入kafka,然后起一个消费者慢慢入库

    客户端网络状况较差对服务器的影响

    待测试

    springboot应用压力上不去的原因分析

    ???

    服务器的QPS不稳定,波动很大

    1. 有可能是磁盘IO方面的问题,先从磁盘IO入手排查
    2. 有可能是GC导致(Java应用)
    3. 排查定时任务的影响

    Redis中的大key(没遇到过)

    参考
    大key(bigkey)是指 key 的 value 是个庞然大物,例如 Hashes, Sorted Sets, Lists, Sets,日积月累之后,会变得非常大,可能几十上百MB,甚至到GB。
    如果对这类大key直接使用 del 命令进行删除,会导致长时间阻塞,甚至崩溃。
    因为 del 命令在删除集合类型数据时,时间复杂度为 O(M),M 是集合中元素的个数。
    Redis 是单线程的,单个命令执行时间过长就会阻塞其他命令,容易引起雪崩。

    CPU更换会导致性能测试结果不一致

    某次性能测试,在特定场景下,CPU占用达到10%
    一段时间后复测,发现相同环境,相同测试条件下,CPU占用超过20%
    是更换了CPU导致的
    PS. 可以通过在不同环境,如:阿里云和本地环境,相同配置,对比性能差异

    一次fullgc问题排查

    获取dump文件

    内存dump

    jmap -dump:format=b,file=temp.dump 209669

    压缩之后效果明显

    tar czvf temp.dump.tgz temp.dump

    分析

    TODO

    php项目,由哨兵读写切换到master读slave写之后,服务器CPU升高

    对比之前测试结果,怀疑是由于增加了一个redis连接过程导致的(待验证)

    网卡多队列问题


    如图:核心4的si很高(其他核心完全没有压力),再加上us和sy,已经基本满载,压力无法继续增长

    查看中断信息

    # -d(高亮显示不同)-n(时间间隔)
    # 查看软中断信息
    $ watch -d -n 1 'cat /proc/softirqs'
    Every 1.0s: cat /proc/softirqs                                                                                                                                                                                    Tue Aug  4 11:50:44 2020
    
                        CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
              HI:          1          0          1          0          0          0          0          0
           TIMER:   54781652   81663642   70986050   77070151  178122347   67691843   65064022   63776794
          NET_TX:         35         26         46         39       5980        428         61         30
          NET_RX:    1000783    1326122    1145066    1585512  130222092     315671     314158     315617
           BLOCK:       2249          0    1573263          0    3187153      77933     144284     119590
    BLOCK_IOPOLL:          0          0          0          0          0          0          0          0
         TASKLET:       2833       2702       2490       2581       3647       5016       6108       5736
           SCHED:   25372471   44086994   35319101   43085487   72355559   31544402   31686817   31622517
         HRTIMER:          0          0          0          0          0          0          0          0
             RCU:   33682053   38010549   35206234   35455568   79230163   36428085   33815438   33081089
    
    # 查看硬中断信息
    $ watch -d -n 1 'cat /proc/interrupts'
    Every 1.0s: cat /proc/interrupts                                                                                                                                                                                  Tue Aug  4 11:51:34 2020
    
               CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
      0:        157          0          0          0          0          0          0          0   IO-APIC-edge      timer
      1:         10          0          0          0          0          0          0          0   IO-APIC-edge      i8042
      6:          3          0          0          0          0          0          0          0   IO-APIC-edge      floppy
      8:          1          0          0          0          0          0          0          0   IO-APIC-edge      rtc0
      9:          0          0          0          0          0          0          0          0   IO-APIC-fasteoi   acpi
     10:    3128824          0          0          0          0          0          0          0   IO-APIC-fasteoi   virtio0
     11:         34          0          0          0          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb1
     12:         15          0          0          0          0          0          0          0   IO-APIC-edge      i8042
     14:          0          0          0          0          0          0          0          0   IO-APIC-edge      ata_piix
     15:        134          0          0          0    6113276          0          0          0   IO-APIC-edge      ata_piix
     24:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio1-config
     25:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio1-control
     26:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio1-event
     27:       3928          0    2020590          0          0          0          0          0   PCI-MSI-edge      virtio1-request
     28:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio3-config
     29:        245          0          0          0  129489889          0          0          0   PCI-MSI-edge      virtio3-input.0
     30:       2665          0          0          0          0          0          0          0   PCI-MSI-edge      virtio3-output.0
     31:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-config
     32:         24          0          0          0        163          0          0          0   PCI-MSI-edge      virtio2-virtqueues
    NMI:          0          0          0          0          0          0          0          0   Non-maskable interrupts
    LOC:  117496431  145560317  135564227  144897852  253495896  132232223  129489879  127900756   Local timer interrupts
    SPU:          0          0          0          0          0          0          0          0   Spurious interrupts
    PMI:          0          0          0          0          0          0          0          0   Performance monitoring interrupts
    IWI:    2014539    2436698    2192873    2214987   16802361    1859998    1729236    1756322   IRQ work interrupts
    RTR:          0          0          0          0          0          0          0          0   APIC ICR read retries
    RES:   37242930   32193980   31128382   30542905   28653311   40686633   36117712   34502154   Rescheduling interrupts
    CAL: 4294965800 4294965696 4294965962 4294965759     129026      76003     142462     117692   Function call interrupts
    TLB:    2451462    2725212    2388287    2295359    2210189    2412439    2138699    2096039   TLB shootdowns
    TRM:          0          0          0          0          0          0          0          0   Thermal event interrupts
    THR:          0          0          0          0          0          0          0          0   Threshold APIC interrupts
    DFR:          0          0          0          0          0          0          0          0   Deferred Error APIC interrupts
    MCE:          0          0          0          0          0          0          0          0   Machine check exceptions
    MCP:      20868      20868      20868      20868      20868      20868      20868      20868   Machine check polls
    ERR:          0
    MIS:          0
    PIN:          0          0          0          0          0          0          0          0   Posted-interrupt notification event
    NPI:          0          0          0          0          0          0          0          0   Nested posted-interrupt event
    PIW:          0          0          0          0          0          0          0          0   Posted-interrupt wakeup event
    

    查看系统是否支持多队列网卡

    # 显示详细的pci设备信息,v越多,越详细,当然,上限3个,这里要看Ethernet controller中的MSI-X: Enable+数据
    $ lspci -vvv
    00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
            Subsystem: Red Hat, Inc. Qemu virtual machine
            Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    
    00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
            Subsystem: Red Hat, Inc. Qemu virtual machine
            Physical Slot: 1
            Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    
    00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] (prog-if 80 [Master])
            Subsystem: Red Hat, Inc. Qemu virtual machine
            Physical Slot: 1
            Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Region 0: [virtual] Memory at 000001f0 (32-bit, non-prefetchable) [size=8]
            Region 1: [virtual] Memory at 000003f0 (type 3, non-prefetchable)
            Region 2: [virtual] Memory at 00000170 (32-bit, non-prefetchable) [size=8]
            Region 3: [virtual] Memory at 00000370 (type 3, non-prefetchable)
            Region 4: I/O ports at c0c0 [size=16]
            Kernel driver in use: ata_piix
            Kernel modules: ata_piix, pata_acpi, ata_generic
    
    00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) (prog-if 00 [UHCI])
            Subsystem: Red Hat, Inc. QEMU Virtual Machine
            Physical Slot: 1
            Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin D routed to IRQ 11
            Region 4: I/O ports at c080 [size=32]
            Kernel driver in use: uhci_hcd
    
    00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
            Subsystem: Red Hat, Inc. Qemu virtual machine
            Physical Slot: 1
            Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Interrupt: pin A routed to IRQ 9
            Kernel driver in use: piix4_smbus
            Kernel modules: i2c_piix4
    
    00:02.0 VGA compatible controller: Cirrus Logic GD 5446 (prog-if 00 [VGA controller])
            Subsystem: Red Hat, Inc. QEMU Virtual Machine
            Physical Slot: 2
            Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Region 0: Memory at fc000000 (32-bit, prefetchable) [size=32M]
            Region 1: Memory at febf0000 (32-bit, non-prefetchable) [size=4K]
            Expansion ROM at febd0000 [disabled] [size=64K]
            Kernel driver in use: cirrus
            Kernel modules: cirrus
    
    00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
            Subsystem: Red Hat, Inc. Device 0001
            Physical Slot: 3
            Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
            Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin A routed to IRQ 10
            Region 0: I/O ports at c000 [size=64]
            Region 1: Memory at febf1000 (32-bit, non-prefetchable) [size=4K]
            Expansion ROM at febe0000 [disabled] [size=64K]
            Capabilities: [40] MSI-X: Enable+ Count=5 Masked-
                    Vector table: BAR=1 offset=00000000
                    PBA: BAR=1 offset=00000800
            Kernel driver in use: virtio-pci
            Kernel modules: virtio_pci
    
    00:04.0 SCSI storage controller: Red Hat, Inc. Virtio block device
            Subsystem: Red Hat, Inc. Device 0002
            Physical Slot: 4
            Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
            Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin A routed to IRQ 11
            Region 0: I/O ports at c040 [size=64]
            Region 1: Memory at febf2000 (32-bit, non-prefetchable) [size=4K]
            Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
                    Vector table: BAR=1 offset=00000000
                    PBA: BAR=1 offset=00000800
            Kernel driver in use: virtio-pci
            Kernel modules: virtio_pci
    
    00:05.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
            Subsystem: Red Hat, Inc. Device 0005
            Physical Slot: 5
            Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
            Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin A routed to IRQ 10
            Region 0: I/O ports at c0a0 [size=32]
            Kernel driver in use: virtio-pci
            Kernel modules: virtio_pci
    
    # 这样写也行,但是没法判断具体是哪个设备的数值,建议使用第一种
    $ lspci -vvv | grep "MSI-X: Enable+ " 
            Capabilities: [40] MSI-X: Enable+ Count=5 Masked-
            Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
    

    查看网卡是否支持多队列

    $ ethtool -l eth0
    Channel parameters for eth0:
    Pre-set maximums:
    RX:             0
    TX:             0
    Other:          0
    Combined:       2
    Current hardware settings:
    RX:             0
    TX:             0
    Other:          0
    Combined:       2
    

    设置队列数

    $ ethtool -L eth0 combined 1
    $ ethtool -l eth0
    Channel parameters for eth0:
    Pre-set maximums:
    RX:             0
    TX:             0
    Other:          0
    Combined:       2
    Current hardware settings:
    RX:             0
    TX:             0
    Other:          0
    Combined:       1
    
    

    irqbalance

    $ systemctl status irqbalance
    

    一次压测出现服务无响应,服务端端口出现五百多个CLOSE_WAIT,剩下的都是SYN_RECV


    没有GC压力,但是老年代都是满的

    服务器是16G的,服务启动内存设置的512M,加大内存设置到4G,重启问题消失,执行观察中~

    一次压测出现QPS越跑越低,但是并没有出现慢查询sql的现象

    因为随着时间增长,数据库中的数据越来越多,userId是唯一的,脚本随机范围是9000w,时间久了之后新生成的userId是重复的,代码逻辑中执行的操作是update
    update需要一个一个的执行,之前重复少的时候mysql操作主要是insert,而且是批量插入
    后来update变多之后,mysql的压力就变大了,整体性能下降了

  • 相关阅读:
    mac下chrome快捷键,vscode快捷键
    css3 rgba()/opacity()
    sublime 将打字内容放在屏幕中央
    HDU 1427 速算24点【数值型DFS】
    HDU 1015 Safecracker【数值型DFS】
    HDU 2553 N皇后问题【棋盘型DFS】
    HDU 2660 Accepted Necklace【数值型DFS】
    2016中国大学生程序设计竞赛
    DFS之奇偶剪枝
    G
  • 原文地址:https://www.cnblogs.com/CSunShine/p/11646273.html
Copyright © 2011-2022 走看看