记一次服务器mysql占用过大的排查
背景
公司测试服务器上,跑了N多的应用,某天mysql的CPU占用超高,http的请求部分也有超20%以上的。
参考
mysql/mariadb知识点总结(24):慢查询日志
http://www.zsythink.net/archives/1260
关于MySQL 通用查询日志和慢查询日志分析
https://www.jianshu.com/p/ac4f291b806a
mysql中slow query log慢日志查询分析
https://www.cnblogs.com/musings/p/5913186.html
过程
记录全部的log
开启全部的sql记录,先看看全局的
1 | show variables like '%general%'; |
发现没有开,
1 | set global general_log=on; |
我们打算用文件的形式记录下来
1 | show variables like '%log_output%'; |
这个时候就可以去查看
1 | /var/lib/mysql/ecs-248d.log |
(注意:上述命令只对当前生效,当MySQL重启失效,如果要永久生效,需要配置 my.cnf)
记录慢查询log
先查看下
1 | show variables like ‘%quer%’; |
1 | +-------------------------------+-------------------+ |
开启慢查询的条件,设置long_query_time
为1秒
1 | set long_query_time=1; |
试一试有没有生效
1 | select sleep(2); |
到/var/lib/mysql/ecs-248d-slow.log
查看下有没有
1 | # Time: 190605 17:32:20 |
如果太多了,用
1 | mysqldumpslow -s t /var/lib/mysql/ecs-248d-slow.log |
帮我们统一下
记一次服务器cpu了解
背景
自己写的php代码,执行mysql时,占用了很大的CPU,排查问题修改代码后,发现公司服务器已经没有这个问题,连续请求,mysql的内存不会增加。但是客户的机子上,连续请求还是会出现这个问题。
经排查后,应该是客户服务器上的CPU处理速度跟不上,导致mysql执行效率跟不上,被阻塞住。导致CPU会因为请求数量的累加而上升。而公司服务器因为处理速度快,即使请求速不断累加,其CPU的值也上升很少。
参考
在linux 下怎么查看服务器的cpu和内存的硬件信息
https://zhidao.baidu.com/question/155943069.html
intel xeon(skylake) platinum 8163 性能评测 阿里云第四代ECS服务器
https://yq.aliyun.com/articles/622603
cocos入门解读小猫钓鱼
背景
一直想弄一个小游戏出来,但是因为想用框架,在框架的选择上面兜兜转转,用了一遍,cocos是我最早接触的那时,还是叫cocos-js,后来出了个cocos-creator之后就没怎么深入了。2018年下半年又重新去接触微信小游戏,选了白鹭引擎,刚看完文档,有个同事说laya不错,看了一下laya的基础代码,感觉比白鹭简单(入坑)。但随着自己不断的深入已经想了解一些功能的实现时,laya的文档和教程可以几乎没什么帮助。查看github上的项目,也就那么几个。最后又去看白鹭社区,白鹭的开源项目还是很多的,有想重新用回白鹭的冲动,但忍住了。但某天一个简单功能在laya的模拟器跑正常,但到了微信开发工具里却始终无效,看了社区,这个问题据说已经在早几个版本里已经修复(当然不知道mac上面有没有修复),之后彻底对laya失去了希望。
重新看了白鹭和cocos-creator,最后发现cocos-creator的设计模式,很符合我的口味,突然有种为什么之前不先考虑cocos的遗憾。
后来看到了一个“小猫钓鱼”的cocos项目。作者的教程真的写的很详细,果断重新入坑cocos。
参考
CocosCreator微信小游戏入门实战《小猫钓鱼》
https://blog.csdn.net/zzx023/article/details/83063363
记一次ftp环境的搭建
背景
给客户的服务器上安装ftp环境
参考链接
Linux下如何进行FTP设置:vsftp
https://www.cnblogs.com/eagling/articles/4848669.html
FTP主动模式和被动模式的区别
https://www.cnblogs.com/dancheblog/p/3799448.html
Linux Vsftpd 连接超时解决方法(被动模式)
https://blog.51cto.com/5468755/1594648
配置过程
vsftpd安装,执行以下命令:
1 | yum -y install vsftpd |
我们选择了“vsftp配置虚拟用户”
使用vsftpd虚拟用户登录FTP服务器进行常见的操作。
首先安装FTP 虚拟用户需要用到的软件及认证模块
1 | yum install pam* libdb-utils libdb* –skip-broken –y (Centos7) |
编辑vim /etc/vsftpd/ftpusers.txt
1 | user001 |
第一行为FTP虚拟用户,登录用户名,第二行为密码,第三行为用户名,依次类推。
创建并生成vsftpd数据库文件,生成数据库文件命令:
1 | db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db |
配置PAM验证文件:
在配置文件vi /etc/pam.d/vsftpd 行首加入如下两行认证语句:(如果是32位,lib64需改成lib,如果RedHat,加入的语句不一样,需注意)
1 | auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login |
创建vsftpd映射本地用户:
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码,也不需要登录。主要用来做虚拟用户映射使用。
1 | useradd -s /sbin/nologin ftpuser |
修改vsftpd.conf配置文件:
1 | anonymous_enable=NO |
保存重启,service vsftpd restart 即可使用虚拟用户登录,这时候所有的虚拟用户共同使用/home/ftpuser目录上传下载,如果想使用自己独立的目录,可以在/etc/vsftpd/vsftpd_user_conf目录创建各自的配置文件,如给admin创建独立的配置文件:
1 | mkdir -p /etc/vsftpd/vsftpd_user_conf |
以上内容是参照其他博文做的,到这个时候,我以为已经大功告成,结果
结果出现各种
500 Illegal PORT command
227 Entering Passive Mode…
一大堆问题,总之引出了 “主动和被动的问题”
看了半天,主动和被动的关系,决定采用“主动模式”(开始入坑)
当初为什么选主动,因为博文里说了主动,服务器安全些。而且在配置21端口和20端口的时候,移动云的虚拟防火墙把我坑了一把。
可是无论我怎么配,都搞不定。。。登录成功目录出不来
在最后发现了第三篇博文,被动模式(本想直接跳过去的,但看见他报的错误和我一模一样,抱着转被动试试看)
1,vi /etc/vsftpd/vsftpd.conf
1 | pasv_enable=YES |
2、加载内核 ip_conntrack_ftp 和 ip_nat_ftp(终端执行)
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
3.配置 iptables 开放 61001 到 62000 端口
vi /etc/sysconfig/iptables 在*filter下加入下
-A OUTPUT -p tcp –sport 61001:62000 -j ACCEPT
-A INPUT -p tcp –dport 61001:62000 -j ACCEPT
过程遇到的坑
1、坑1—移动运的虚拟
21端口 在安全组里加了 没在虚拟防火墙中配置
2、坑2—主动模式的选择
3、坑3— -A OUTPUT -p tcp –sport 61001:62000 -j ACCEPT 没有配置
记一次使用leftjoin,group及子查询的配合使用
背景
库存数据统计
库存的数量动态的,列出产品的同时,将批次表里的同product_id的cur_num相加,作为该产品的库存
以前的做法
先将产品列表取出(一条sql)
foreach 每个产品,并查询总数(当前页数*1条sql)
改进后的做法
先用子查询获取查询的总数,然后一下group,group后的字段作为leftjoin的关联字段
1 | $storeProductBatchQuery = M('store_product_batch as spb')->field('SUM(cur_num) as spb_cur_num_count,product_id')->group('product_id')->buildSql(); // group的使用 |
安装python3
背景
安装TensorFlow
安装python3
1 | brew install python3 |
1 | Pip, setuptools, and wheel have been installed. To update them |
使用阿里云邮件推送实现SMTP发送邮件
背景
一个wordpress项目里的自带的邮件(代发)发送邮件不稳定。
参考
WordPress 使用阿里云邮件推送实现SMTP发送邮件
https://www.wpdaxue.com/wordpress-aliyun-smtp.html
来自第三方的介绍
6、切换到“发信地址”界面,新建发信地址:
现在很多虚拟主机都是默认不支持 mail() 函数发送邮件的,不过一般都提供 smtp 发件支持。要找一个好用的 smtp 发送邮件方可不容易,不是发件数量限制太小,就是经常被判为垃圾邮件。所以倡萌此前一直在服务器搭建邮件发送功能,并想办法优化提高邮件可行度,避免被判为垃圾邮件,但效果还是不太理想。前些天,想起了阿里云的邮件推送服务,并进行了测试,发现真的不错哦。
步骤
1、要了解和开通阿里云邮件推送服务,请查看:https://www.aliyun.com/product/directmail
2、开通以后,在控制台进入“发信域名”新建域名
阿里云里提示最好用二级域名,但是service@email.jk-kj.com类似的邮箱还是会被某些插件不认可。最后我还是用上了service@jk-kj.com
3、添加域名后,点击配置,可以查看到域名配置信息
4、按照域名配置信息的提示,到你的域名解析后台添加3条解析记录:
5、添加完解析记录,回到阿里云后台,点击“验证”,返回“验证通过”说明解析生效:
6、切换到“发信地址”界面,新建发信地址:
7、选择刚才添加的发信域名,然后输入你要使用的账号,输入回信地址,选择发信类型:批量邮件
注:发信类型有:
触发邮件:注册确认、订单确认、密码重置、交易通知等
批量邮件:自有用户的产品促销、期刊订阅等
但是有些用户反馈,触发邮件方式不太稳定,你可以根据自己的实际选择吧,这里我选择的是批量邮件
8、添加完返回到界面,点击“验证回信地址”,然后会发送邮件到你的回信地址,到你的邮件箱点击邮件的链接验证通过即可,注意哦,验证邮件可能在垃圾箱里。然后设置SMTP 密码。
9、完成上面的步骤后,阿里云的邮件推送的SMTP发送功能就设置好了
MySql按周,按月,按日分组统计数据
背景
之前开发微信时,做过类似的简单统计。那时对于mysql的理解比较浅,有些数据都是预先存入数据去实现的。这时就会出现多个时间,比如create_time create_date。
现在开发开单宝的统计,特意搜索了一下关于统计时mysql处理的文章
参考
MySql按周,按月,按日分组统计数据
https://blog.csdn.net/lqclh502/article/details/50157483
MySQL中distinct和count(*)的使用方法比较
http://www.jb51.net/article/74559.htm
几个关键词
网上的资料
关键词:DATE_FORMAT
对时间进行格式化
例子:
1 | select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; |
DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中:
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”
动手实战
网上写的是DATE类型的字段的处理,可是我习惯用int类型的时间戳保存时间
需要改进一下
1 | DATE_FORMAT( FROM_UNIXTIME(create_time),'%Y-%m-%d' ) AS days |
接下来只要对 days months weeks进group就OK
thinkphp下的代码
1 | $list = M("Order") |
关键词:DISTINCT
在count不重复的记录的时候就能用到它,
上面的代码里就用到了COUNT( DISTINCT customer_id ) AS customer_id_count
,有了这个关键词,就不用以前的笨方法了
记一次php安装ImageMagick扩展
背景
将pdf转png图片
参考
在wamp server环境下安装php_imagick拓展
http://www.smallerpig.com/673.html
windows php安装ImageMagick扩展
http://blog.csdn.net/livelinux/article/details/50319853
Centos 安装ImageMagick 与 imagick for php步骤详解
https://www.cnblogs.com/xingmeng/p/4268043.html#undefined
本机wamp下安装php_imagick拓展
步骤
1.在php安装目录的ext文件夹下新建imagick文件夹
2.将该文件夹的路径添加到系统路径(path值).
3.从网址http://windows.php.net/downloads/pecl/releases/imagick/下载对应php版本的imagick(phpinfo中看php version,Compiler ,Architecture,这三个属性)
4.这里需要注意的是下载的文件区别,我们从文件名中来区分,例如php_imagick-3.2.0b2-5.5-nts-vc11-x86.zip
其中5.5是对应的php版本.
nts值代表该文件适用于IIS,ts代表该文件适用于Apache,
VC11和VC9是编译器的版本.我们可以适用phpinfo()命令来查看我们机器上php适用的是哪个版本(如图1)
x86代表适用32位系统,x64代表适用64位系统
5.下载好对应的zip文件后,将所有文件解压到我们第一步新建的imagick文件夹!
6.添加php_imagick.dll的完整路径到php.ini文件中.例如:extension=C:\wamp\bin\php\php5.5.12\ext\ext\imagick\php_imagick.dll
7.重启wamp服务器
8.运行phpinfo看看是不是已经成功添加拓展了
9.查看phpinfo中,查看ImageMagick supported formats内的值
输入phpinfo()看到imagick,就算装成功了,但这个时候还不能用,你会看到ImageMagick number of supported formats 为0,ImageMagick supported formats no value,还要安装ImageMagick ,phpinfo里面会写出要安装那个版本的,如:
1 | ImageMagick 6.9.3-7 Q16 x64 2016-03-27 http://www.imagemagick.org |
然后去下载这个ImageMagick 6.9.3-7 Q16 x64 版本的安装
记得版本要对得上号,要不然就会出现ImageMagick supported formats no value
安装完后重启,再输入phpinfo,就会看到ImageMagick supported formats不是空的了,这个时候就算安全成功
Centos 安装ImageMagick
1. 依次运行以下命令
1 | yum install ImageMagick |
1 | yum -y install php-devel |
2. 安装C编译器
1 | yum install gcc |
如果装不了gcc就用这个命令:
1 | yum install gcc gcc-c++ autoconf automake |
3. 安装imagick
1 | pecl install imagick |
4. 加载imagick到php
在/etc/php.ini 加上extension=imagick.so
5. 重启service httpd restart
6. 使用 phpinfo() 或运行 php -m | grep imagick 来查看是否安装成功
mac 上安装
安装php的imagick拓展
1 | brew reinstall php56-imagick --build-from-source |
安装ghostscript
1 | brew install ghostscript |
linux上安装
这次被坑惨了,linux是最近新的服务器里面没有安装过GD库,这个导致我后面多个坑
第一次安装走的是
https://www.cnblogs.com/xingmeng/p/4268043.html#undefined
里面的方法,
1 | yum install ImageMagick |
加载imagick到php
在/etc/php.ini 加上extension=imagick.so
重启service httpd restart
使用 phpinfo() 或运行 php -m | grep imagick 来查看是否安装成功
这次
1 | Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator,(ImagickKernel 不知道为什么没有这个,本机和mac上都有) |
结果提示错误,具体忘记了,估计是因为GD库没有引起的
之后照着
http://blog.csdn.net/snow_small/article/details/79173575
进行了编译安装
1、安装ImageMagic
1 | [root@localhost download]# wget http://www.imagemagick.org/download/ImageMagick.tar.gz |
2、检查是否安装成功
1 | [root@localhost ImageMagick-7.0.7-22]# /usr/local/imagemagick/bin/convert -version |
我的坑
但是报下面这个错误
1 | Postscript delegate failed |
是ghostscript
没安装,可实际是安装的在/usr/bin/gs
中,但apache死活说找不到(是权限问题),网上有个解决方案是把’/usr/local/bin/gs’做软连接到/usr/bin/gs
,可是我这边的情况刚好是倒过来的。
一狠心把ghostscript
给卸载了,重新编译安装了gs,这次真出现在了/usr/local/bin/gs
,建立了个软连接,真把这个问题解决了。
这次因为没有安装GD库,用的png版本太老,Delegates (built-in): fontconfig freetype jng jpeg (png 没显示) x xml zlib
一直提示no decode delegate for this image format PNG
因为没有安装GD库,我在编译ImageMagick-7.0.7-22
时没有将png
编译进行
直到手动添加了png库,才最终发现没有安装GD库
我们在Centos安装ImageMagick教程中讲述了如何安装ImageMagick,安装完毕之后发现程序并不支持png和jpeg格式的图片,但是这两种图片又是我们平时所常见的,所以我们还要进一步地配置,是其支持png和jpeg格式.
首先我们安装所需的库文件.
1 | yum install tcl-devel libpng-devel libjpeg-devel ghostscript-devel |