基本情况
1 | [root@test ~]# cat /etc/redhat-release |
改动了dns配置
1 | [root@test rc3.d]# stat /etc/resolv.conf |
增加了开机启动
1 | [root@test cron]# ll /etc/init.d/wipefs |
清理
1 | pkill wipefs |
1 | [root@test ~]# cat /etc/redhat-release |
1 | [root@test rc3.d]# stat /etc/resolv.conf |
1 | [root@test cron]# ll /etc/init.d/wipefs |
1 | pkill wipefs |
I have noticed that even if you do a fsck on the disk the problem may occur again in a few days.
I have found that the problem is worse on SSD disks than the regular HDD disks. I have found some steps that may fix the problem temporarily.
fsck -fy /dev/sda1
if sda1 is the right partition - the prompt will tell you exactly which one requires fsck.
After that if the systems boots up you may have another problem with the package management system, so if you open a terminal and type sudo apt-get update you may get an error. Do not worry. Run these commands:
1 | sudo apt-get update |
My opinion is that there is serious problem in Ubuntu with regard to SSD disks. The community should fix it.
I have found a possible cause of this problem: Probably the system did not shutdown normally.
setup NFS but when trying to mount getting the following errors
mount.nfs: access denied by server while mounting <server ip>:/exports
The
showmount -e <server ip>
command returns the following
/exports <client ip>
操作系统安装时选择了中文字符,导致命令行下的错误提示信息也显示中文。这样无法在google上搜索到相对应的解决方法。所以需要临时修改提示信息为英文
#export LANG=”en_US.UTF-8”
为了搞学习内核编译,需要安装一些开发工具包,索性把光盘镜像设置成本地yum源,这样更快些!以下是一些基本步骤:
1、 首先挂载光盘到/mnt/cd下,mount /dev/cdrom /mnt/cd
,这个就不多说了;
2、 进入``/etc/yum.repos.d/目录下,把原来的yum源备份,我给它重新命名了。
mv CentOS-Vault.repo CentOS-Vault.repo.bak
mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak
mv CentOS-Base.repo CentOS-Base.repo.bak
vim CentOS-Media.repo
1 | # CentOS-Media.repo |
保存退出
4、yum clean all
(清除缓存)
5、yum makecache
(建立新缓存)
一个常见的问题,mysql 导出csv格式的语法,已经乱码问题:
由于数据库一般默认的是UTF-8 格式的字符集,而execl默认的是gbk格式的字符集,这里有两种方法解决乱码:
1 | select * from mobile_order_region where school_id=6921 into outfile '/tmp/6921.txt' |
1 | mysql> select * from mobile_order_region where school_id=6921 into outfile '/tmp/6921.csv' |
在Mysql 数据库中存在两种字符串连接操作.具体操作如下
一. 语法:
CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
例1:
例2:
CONCAT_WS(separator,str1,str2,…)
说明 : string1,string2代表字符串,concat_ws 代表 concat with separator,第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
举例1:
1 | mysql> select concat_ws('#','dbdh=','NorthEastTrcoon',null) AS dbdh_name_three; |
例2:
1 | mysql> select concat_ws(null,'dbdh=','NorthEastTrcoon',null) AS dbdh_name_fourth |
例3:
1 | mysql> select concat_ws('*','dbdh=','NorthEastTrcoon',null) AS dbdh_name_fifth; |
基本查询
1 | mysql> select * from stu1; |
以id分组,把name字段的值打印在一行,逗号分隔(默认)
1 | mysql> select id,group_concat(name) from aa group by id; |
以id分组,把name字段的值打印在一行,分号分隔
1 | mysql> select id,group_concat(name separator ';') from aa group by id; |
以id分组,把去冗余的name字段的值打印在一行,
逗号分隔
1 | mysql> select id,group_concat(distinct name) from aa group by id; |
以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
1 | mysql> select id,group_concat(name order by name desc) from aa group by id; |
还有一个简单的连接方式为: ||
1 | mysql> select * from student; |
1 | mysql> select id+999,name,name+99,name+'999' from student; |
好久没有写博客了,前端时间来了一场说走就走的旅行,和爱人一起辞职,去云南玩了半个月,才刚回来,最近一段时间在找工作,没事就上网看看技术相关的文章,充充电,昨天偶尔发现一遍讲解LNMP的并发与资源分配的文章,感觉不错,和大家分享下。
很多时候面试官都会问你,你们的程序性能如何?程序的并发可以达到多少?程序的瓶颈在哪儿?为了满足业务需求应该购买多少台服务器?负载均衡中php应用服务器需要多少台?
可能这些问题在面试中会设置一个应用的场景及一些前提条件,让面试的人去设计,并提出看法建议,能够回答得很好的人还是比较少的。
内容的分发者,会在文件系统找到相应的文件,就返回给浏览器,如:nginx。如果是静态的文件,就可以直接返回,但是如果是index.php需要解析并执行的脚本文件时,Web Server就无力了,需要将请求转发给相应的脚本语言的解析器来解释并执行,最终将程序的执行结果,返回给Web Server,再返回给浏览器。
那么php与nginx的常规协作方式是如何的呢?需要我们明确几个概念
通用网关接口,是HTTP协议中描述的,Web Server与后端处理程序进程间通信的协议
php实现了cgi协议,使得web server与php共同完成一个动态网页的请求响应
是为了解决cgi性能问题,而规范的另外一种协议,为什么说解决cgi性能问题,因为在面对各大中型网站的业务需求中,cgi程序表现得越来越无力,因为cgi程序在每次接收到请求时都需要启动新的进程,并初始化环境,然后执行程序,具体的协议内容,在此不引述。
实现了fastcgi协议,是php-cgi的进程管理器,解决高并发网站的性能问题。
在最终回答LNMP的并发考虑与资源分配还需要明确的几个概念
一般由单位内完成的请求数来衡量,如,每秒事务数(TPS),每秒HTTP请求数(HPS),每秒查询数(QPS)。通常情况下,我们说PHP的并发,都是指一秒内PHP完成的动态请求的次数。如某网站高峰期的动态请求并发为5000每秒,这个数字不算太高,但也不低。一般日活跃用户数在1000万-5000万的网站应用才能达到这个级别。
一般是指应用程序的处理速度,如果php的应用程序,打开一个页面(执行一个脚本程序)通常需要在50-100ms完成,这对程序的性能要求还是比较高的。但是这还仅仅只是程序处理,php处理完成之后,还要交给web server,web server再将数据返回浏览器,这中间会有一个网络延迟,通常网络正常的情况下,需要大约100ms,最终一个动态网页的请求大约200ms(理想的情况下)可以到达用户浏览器端(仅仅是一个html结构)。
#2.资源分配
按照上面的描述,并发为5000每秒,每个请求完成大约200ms(具体页面要具体分析,这里只是一个理想值),如果只有5台PHP应用程序服务器,那么每台机器平均为并发1000每秒,如果是使用nginx+php-fpm的架构,php-fpm的php-cgi进程管理器的配置应该如何呢?我计算的结果为(具体的配置项说明在后文):
网络带宽也会是一个重要的因素,如果你的服务处理很强,但是用户的请求和响应不能及时到达也是白忙活,这个参数如何计算呢?
并发5000每秒,每个请求的输出为20K,则5000x20K=100000K=100M
这就要求你的公网负载均衡器外网出口带宽至少要达到100M
上述中100个php-fpm的worker处理进程,理论上如果服务器只运行php-fpm,那么我们可以将服务器内存的一半分配给php-fpm,通常情况下,我们可以认为一个php-fpm的worker处理进程占用内存20M,那么100x20M=2G,也就是说明服务器的内存大约为4G
由于php-fpm是一个多进程的模型应用,CPU进程调度消耗也是很大的,并且PHP应用程序有问题也会导致CPU占用率高,这就没有量化的指标,需要具体情况具体分析了。但是有一个小建议,可以部署一个crontab每隔一分钟检测cpu占用率超过多少就kill掉相应的php-fpm的worker处理进程。
如果nginx与php在同一台机器,nginx与php-fpm使用unix域套接字代替tcp socke进行通信,这个配置挺关键的,纯echo的ab测试,采用unix域套接字每秒请求数提升10%-20%
即nginx中配置:
1 | fastcgi_pass unix:/data/server/var/php/php-fpm.sock; |
php-fpm.conf中配置:
1 | listen = /data/server/var/php/php-fpm.sock |
最后遇到很多同学对php-fpm的进程管理器的核心配置不太了解,下面是我翻译的配置说明:
在同一时间最大的进程数
php-fpm启动时开启的等待请求到来的进程数,默认值为:min_spare_servers + (max_spare_servers – min_spare_servers) / 2
在空闲状态下,运行的最小进程数,如果小于此值,会创建新的进程
在空闲状态下,运行的最大进程数,如果大于此值,会kill部分进程
空闲多少秒之后进程会被kill,默认为10s
每个进程处理多少个请求之后自动终止,可以有效防止内存溢出,如果为0则不会自动终止,默认为0
注册的URI,以展示php-fpm状态的统计信息
ping url,可以用来测试php-fpm是否存活并可以响应
ping url的响应正文
zeroconf (Zero configuration networking), is a techniques that automatically creates a usable Internet Protocol (IP) network without manual operator intervention or special configuration servers. 169.254.0.0/255.255.0.0 route is part of zeroconf under RHEL 6 / CentOS 6 or older versions. To see current routing table, enter:
1 | # route -n |
Sample outputs:
1 | Kernel IP routing table |
Every time the server or Linux desktop boots, the zeroconf route 169.254.0.0 is enabled and added to the kernel routing table. To disable zeroconf route under RHEL / CentOS / Fedora Linux, enter:
1 | # vi /etc/sysconfig/network |
Append the following directive:
NOZEROCONF=yes
Save and close the file. Reboot the system / server or restart the networking service:
Verify routing table, enter:
OR