MySQL性能优化前后对比测试

一、MySQL优化参数详解 1)   连接请求的变量 Max_connections Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连接提供缓冲区,就会开销的越多的内存,所以需要适当的调整该值,不能随便去提高设值。 修改/etc/my.cnf在[mysqld]下添加以下内容,设置最大连接数为1024,重启mysql服务验证 vim/etc/my.cnf 添加max_connections=1024 2)back_log mysql能暂存的连接数量,当主要mysql线程在一个很短时间内得到非常多的连接请求时候它就会起作用,如果mysql的连接数据达到max_connections时候,新来的请求将会被存在堆栈中,等待某一连接释放资源,该推栈的数量及back_log,如果等待连接的数量超过back_log,将不被授予连接资源 back_log值指出在mysql暂时停止回答新请求之前的短时间内有多少个请求可以被存在推栈中,只有如果期望在一个短时间内有很多连接的时候需要增加它 可以通过以下命令查看back_log的设置默认是254 我们可以通过MySQL主配置修改它的大小,设置最大连接数为:1024随后重启MySQL服务再次查看 vim /etc/my.cnf 添加:back_log=1024 3)wait_timeout和interactive_timeout wait_timeout:指的是mysql在关闭一个非交互的连接之前所要等待的秒数 interactive_timeoutz:指的是mysql在关闭一个交互的连接之前所需要等待的秒数,比如我们在终端上进行mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动的断开,默认的是28800,可调优为7200。wait_timeout:如果设置太小,那么连接关闭的就很快,从而使一些持久的连接不起作用 如果设置太大,容易造成连接打开时间过长,在show processlist时候,能看到很多的连接 一般希望wait_timeout尽可能低 查看wait_timeout和interactive_timeout的设置 修改/etc/my.cnf,添加以下内容 wait_timeout=100 interactive_timeout=100 4)query_cache_size(查询缓存简称QC) 使用查询缓冲,mysql将查询结果存放在缓冲区中,今后对于同样的select语句(区分大小写),将直接从缓冲区中读取结果。 一个sql查询如果以select开头,那么mysql服务器将尝试对其使用查询缓存。 注:两个sql语句,只要想差哪怕是一个字符(列如大小写不一样;多一个空格等),那么这两个sql将使用不同的一个cache。 上述状态值可以使用show status like 'Qcache%获得' Qcache_free_blocks:缓存中相邻内存块的个数。如果该值显示较大,则说明Query Cache 中的内存碎片较多了,FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。 注:当一个表被更新之后,和它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。可以用FLUSH QUERY CACHE语句来清空free blocks Qcache_free_memory:Query Cache中目前剩余的内存大小。通过这个参数我们可以较为准确的观察出当前系统中的Query Cache内存大小是否足够,是需要增加还是过多了。 Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。 Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。 Qcache_lowmem_prunes:多少条Query因为内存不足而被清除出Query Cache。通过“Qcache_lowmem_prunes”和“Qcache_free_memory”相互结合,能够更清楚的了解到我们系统中Query Cache 的内存大小是否真的足够,是否非常频繁的出现因为内存不足而有Query被换出。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocks和free_memory可以告诉您属于哪种情况) Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT语句或者用了now()之类的函数。…

Continue Reading

手机无限流量摇身变宽带

一、背景介绍 联通一个电话宣布我的手机卡不限流量,我第一个想法就是把手机当成无线路由器分给家里的一堆设备用,停用每月180块的坑爹电信宽带。 废话少说,开工。 二、设计思路 手机开启无线热点,使用一带有无线中继功能的路由器A连接手机的无线信号,然后让一具备高级功能的路由器连接B通过有线方式连接路由器A的LAN口,在路由器B上建立三个VLAN,再在每个VLAN上对应建立网桥Bridge,每个网桥都建立IP,选择路由器B的一个以太网口和三层交换机的trunk口相连,此时需要在三层交换机上也建立三个VLAN,每个VLAN的ID要和路由器B上的VLAN一一对应,添加每个VLAN接口的IP地址(目的是让内网主机通信时不经过路由器B而直接在交换机内部进行),最后在路由器B上设置每个bridge的DHCP server以及NAT转发即可。 至于各种无线设备如iPad、手机的网络接入实现,可另找一台无线路由器C,关闭DHCP 服务,LAN口直连交换机上任意一个VLAN,移动设备无线接入路由器C即可自动获取IP上网。 大致的网络拓扑图如下, 三、实现过程 1、软硬件准备 A.  RouterOS board路由器(大名鼎鼎,性能堪比Cisco) B.  PISEN路由器(具有无线中继功能) C.  Cisco二手三层交换机 D.  iPhone6s plus、oneplus手机两台,iPad一台 E.  6条以太网双绞线 F.  TP-LINK无线路由器(关闭DHCP服务) G.  树莓派板子raspberrypi(搭载Linux系统) H.  台式机一台(S5),上面安装一个win7虚拟机(virtual-PC) 2、开启手机无线热点 3、PISEN路由器无线中继手机热点 4、ROS添加WAN口IP和默认路由 5、ROS添加VLAN 添加好的VLAN如下图, 6、ROS添加bridge并关联VLAN 按以下方式添加三个bridge, 按以下方式依次关联三个VLAN到对应的bridge, 关联好的配置如下图, 7、ROS为每个bridge添加对应的DHCP SERVER分配IP地址 8、交换机添加VLAN并设置每个VLAN接口的IP 9、交换机添加trunk端口 10、设置ROS的NAT   11、设置ROS的默认DNS 四、测试验证 1、ROS路由器连通外网验证 2、无线设备连接TP-LINK路由器自动获取IP和连通外网验证 我们看到手机已经正常获取172.17.3.0网段的IP地址,网关也正确。   3、各VLAN下内网主机互ping以及连通外网验证 172.17.2.0网段的主机(树莓派板子Linux系统)测试如下, 172.17.1.0网段的主机(Linux系统)测试如下, 172.17.3.0网段的主机(Windows 7系统)测试如下,…

Continue Reading

JMeter如何控制业务比例进行性能测试

一、背景介绍 一直困惑网上的关于JMeter控制业务比例的思想,链接为https://www.jianshu.com/p/db092cbcceb1,今天琢磨到凌晨两点,终于解惑。 假设要测试一个电商网站的性能, 在实际的场景中,有四个业务分别是查看积分明细、查看首页广告、浏览商品详情、浏览商品评价,业务使用比例为1:3:5:6,如何使用JMeter来模拟实现? 二、实现过程 当然新建四个线程组,分别对应四个业务,按照既定比例设定线程数的方式不可行,因为业务的响应时间不可能一致。 我们用另外一种方式来实现。 既定的比例加起来和为15,我们可以把JMeter的运行次数与15取余,前15次取余值的范围落在下面四个范围(这里要用到JMeter的元件IF控制器): {1} {2 3 4} {5 6 7 8 9} {10 11 12 13 14 15}    16 17 18 19 …… 假设四个业务分别对应的业务代码是D、C、B、A,则对应业务的控制逻辑如下, A  ${__counter(true,)}%15<1 B  ${__counter(true,)}%15<=4 && ${__counter(true,)}%15>1 C  ${__counter(true,)}%15>4 && ${__counter(true,)}%15<=9 D  ${__counter(true,)}%15>9 && ${__counter(true,)}%15<==0 大于15的运行次数也可以以这种方式类推,进行比例划分。 1  查看积分明细的业务比例在JMeter中设置为${__counter(true,)}%15<1,如下图, 2  查看首页广告的业务比例设置为${__counter(true,)}%15<=4 && ${__counter(true,)}%15>1,如下图, 3  浏览商品详情的业务比例设置为${__counter(true,)}%15>4 && ${__counter(true,)}%15<=9,如下图, 4 …

Continue Reading

自用PC增量备份Shell脚本

最近自己的PC硬盘里丢了个重要文件,应该是我误删除的,所以提醒大家千万别乱删文件,就算删除也要备份一俩月。于是一怒之下写了个shell脚本,专门用于备份重要文件的,主要是通过rsync这个强大的同步工具实现,脚本里也使用了函数创建和调用,具体内容如下, #!/bin/bash   #  this script is made to automatically backup data of host S5 #  Author:Attaboy #  history: #       2016.06.28 #       2016.07.03 #       2016.07.14 #       2017.09.02 #       2017.09.04 #       2017.09.14 #       2017.09.17 #       2017.11.04  anotate bak_node_3 function #       2017.11.07  allow bak_node_3 function #       2017.11.11  allow bak_node_4 function #       2017.11.12  add code to start DELL…

Continue Reading

多台VPS进行JMeter分布式压力测试

最近想研究下Jmeter的分布式测试,于是在Linode云主机上折腾了下,此厂商的主机可以自选硬件配置,收费按照小时计算,所以操作的时候可要手快啊。   一、环境信息 1  被测服务器 日本VPS主机 1152GB硬盘 16核心CPU 内存65536MB IP地址:peloo.net 2  jmeter主控制机 美国VPS主机 内存2048MB 单核心CPU 30GB硬盘 IP地址:173.255.243.59 3  jmeter从机 配置同主控制机,位置同在美国,属于同一个机房 IP地址:173.255.220.37  173.255.223.112     二、环境配置 1  被测服务器 被测服务器上搭建了WordPress网站,架构为Nginx+PHP+MySQL 2  jmeter主控制机配置 (1)  下载官网jmeter tgz文件到tmp目录并解压 wget -c -P /tmp http://mirrors.cnnic.cn/apache//jmeter/binaries/apache-jmeter-3.1.tgz cd /tmp tar zxvf apache-jmeter-3.1.tgz (2)  复制解压目录到/usr/local cp -rv /tmp/apache-jmeter-3.1 /usr/local ln -sv /usr/local/apache-jmeter-3.1 /usr/local/jmeter (3)  添加jmeter环境变量  …

Continue Reading

git仓库迁移(包括提交记录)

背景 一次vps中毒,决定把个人使用的代码仓库迁移到内网的NAS服务器,涉及到几百个提交记录也需要同步迁移到新仓库。 本次使用gitlab作为示例。 迁移过程 # 在新搭建的gitlab新建仓库:home,注意不用带上README.md文件。 # 克隆原有项目 git clone http://xxx/myOrigin.git # 保证本地有旧有仓库的所有分支,最后git push origin –all的时候才会把所有分支迁移过去 git checkout branch_name # 保证本地有旧有仓库的所有tag,最后git push origin –tags的时候才会把所有tag迁移过去 git checkout tag_name # 显示本地所有的远程仓库地址 git remote -v # 注意:若有关联,先删除本地代码分支与旧Gitlab分支的关联关系 # 没有就不需要执行 # git remote remove origin # 把旧远端仓库改个名字,当前的一般默认origin, # 注意:想回到旧仓库就要切换回去 git remote rm origin; git remote rename old-origin origin git…

Continue Reading

zfs文件损坏自愈测试

背景 测试在硬盘冗余的zfs文件系统下,某个硬盘里的文件损坏后是否可以正常访问。 环境信息 系统:ubuntu22.04.4,使用VMware虚拟机创建,除了系统盘之外,添加另外两个相同大小的1G虚拟磁盘。 zfs版本: (py38) pc@vm-ubuntu2204:~$ zfs -V zfs-2.1.5-1ubuntu6~22.04.4 zfs-kmod-2.1.5-1ubuntu6~22.04.3 模拟过程 建立zfs池和数据集 建立两个盘的池,有硬盘冗余,raid-1模式。 sudo apt update -y sudo apt install zfsutils-linux -y sudo zpool create iotdata mirror /dev/sdh /dev/sdi sudo zfs create iotdata/tf sudo zpool status -v 生成测试文件 使用脚本创建150个文件,大小1k~10MB随机,且生成每个文件的md5校验值到/opt目录下,脚本内容如下, #!/bin/bash # @Time : 2024/5/29 23:20 # @Author : Attaboy # @Email : [email protected] #…

Continue Reading

局域网抓包dhcp查看客户端租期

[TOC] 背景 20240417发现局域网内的三个主机老是ssh断联,所以就怀疑是否ip地址冲突,ip地址冲突的原因可能是dhcp获取ip地址的时间很短,所以想确定下当前局域网内的dhcp租期。 本方法适用于懒得用Windows主机连接当前局域网查看租期,恰好局域网内有Linux主机的场景。 查看DHCP租期方法 在Linux主机上,使用tcpdump,无法查看租期字段具体值。 命令如下, pc@vm-ubuntu2204:~$ sudo tcpdump -vvv -tttt -n -c 1 -i ens33 'src 172.17.1.254 and udp port 67' tcpdump: listening on ens33, link-type EN10MB (Ethernet), snapshot length 262144 bytes 2024-04-20 21:11:33.186161 IP (tos 0x0, ttl 16, id 0, offset 0, flags [none], proto UDP (17), length 328) 172.17.1.254.67 > 172.17.1.131.68:…

Continue Reading

curl发送post请求时payload带参数引用

背景 很多web页面F12抓包导出接口到curl bash脚本进行循环调用时,需要给post请求时的payload传入可变参数,遇到了一些坑,在此记录下。 curl发送post请求时payload带参数引用 正常的curl请求,payload是json格式,所以我们在拼接的时候要按照这个格式。 例如,原始payload如下, {"taskName":"deploy-task-1712447852127"} 未使用参数引擎的完整请求命令如下, curl 'http://xx.xx/xx/xx' -d '{"taskName":"deploy-task-1712447852127"}' 如果payload的时间戳会自动变化,就需要拼接payload,完整的请求命令如下, ts=$(date +%s)000 curl 'http://xx.xx/xx/xx' -d "{\"taskName\":\"deploy-task-${ts}\"}" 注意: 1、整个payload要用双引号括起来; 2、payload里的其他特殊字符使用\进行转义,如果需要批量转义payload里的双引号,可以使用如下脚本, sed -r -e 's/"/\\"/g' f.txt

Continue Reading

ubuntu开机卡在“a start job is runing for wait for Network to be configured (1min 23s / no limit)”的解决方法

背景 Ubuntu18及以上发行版安装完系统后,开机总是卡在“a start job is runing for wait for Network to be configured (1min 23s / no limit)”,大概两分钟,如下图, 解决方法 修改初始化失败后的尝试及等待时间,在service那一栏加上TimeoutStartSec=2sec即可, sudo sed -i -e '/TimeoutStartSec/d' /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service sudo sed -i -e '/RemainAfterExit=yes/aTimeoutStartSec=2sec' /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service sudo init 6

Continue Reading

wget下载网站整个目录

背景 有时候使用python -m http.server 8080做出来一个web服务器,给客户端下载时,不想做目录压缩,然后单个文件下载,因为压缩也耗时,所以就想用wget递归下载整个网站目录。 下载方法 下面是示例, sudo wget -c -r -np -k -L -P /mnt/4T_01/bak/home_dev_bak/S5/s5_os_bak/ -p http://172.17.1.231:8080/s5_win10_backup_20240324/

Continue Reading

Linux网络配置新工具ip命令的简单使用

ip link show # 显示网络接口信息 ip link set eth0 up # 开启网卡 ip link set eth0 down # 关闭网卡 ip link set eth0 promisc on # 开启网卡的混合模式 ip link set eth0 promisc offi # 关闭网卡的混个模式 ip link set eth0 txqueuelen 1200 # 设置网卡队列长度 ip link set eth0 mtu 1400 # 设置网卡最大传输单元 ip addr show #…

Continue Reading

Ubuntu18及以上发行版安装docker

sudo apt update -y && sudo apt upgrade -y && sudo apt full-upgrade && sudo apt autoremove -y sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo…

Continue Reading

clonezilla再生龙命令行模式备份和还原

备份 备份到远程ssh目录 # 挂载远程ssh目录 sudo sshfs [email protected]:/home/kali /home/partimag # 备份 sudo /usr/sbin/ocs-sr -q2 -c -j2 -z9p -i 0 -sfsck -senc -p choose savedisk 2024-03-02-13-img sda 备份到本地磁盘 # 挂载保存镜像文件的磁盘目录到本地目录/home/partimag sudo mount /dev/sdb1 /tmp/xxx sudo mount –bind -o noatime /tmp/xxx/xxxx /home/partimag # 备份 sudo /usr/sbin/ocs-sr -q2 -c -j2 -z9p -i 0 -sfsck -senc -p poweroff savedisk autoname…

Continue Reading

linux部署go多版本工具g

安装 cd mkdir ~/.g cat << "EOF" | tee ~/.g/env #!/bin/sh # g shell setup export GOROOT="${HOME}/.g/go" export PATH="${HOME}/.g/bin:${GOROOT}/bin:$PATH" export G_MIRROR=https://golang.google.cn/dl/ EOF cat << "EOF" | tee -a ~/.bashrc # g shell setup if [ -f "${HOME}/.g/env" ]; then . "${HOME}/.g/env" fi EOF exec bash # download g wget -c https://mirror.ghproxy.com/https://github.com/voidint/g/releases/download/v1.6.0/g1.6.0.linux-amd64.tar.gz mkdir ~/.g/bin # unzip…

Continue Reading