分类目录归档:linux

fredzeng与你一起对linux,linux操作系统,linux命令大全,linux查看磁盘空间学习相关知识及探讨!

top3云服务器磁盘IO性能对比测试(阿里云、腾讯云、ucloud)–结果阿里云就是一坨屎

top3云服务器磁盘IO性能对比测试,测试对象包括阿里云、腾讯云、ucloud,测试磁盘包括系统盘,云盘(其中阿里云包括高速云盘),结果腾讯云本地硬盘最快达到600MB/s,因服务器没有云盘但官网说明有60MB/s,Ucloud磁盘读达到400多MB/s,阿里云垃圾仅有50MB/s,只能说阿里云真的很坑爹!很坑爹!!很坑爹!!

1)腾讯云服务器系统盘(641.98 MB/sec)及云盘( 627.78 MB/sec)IO读性能测试

[root@~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       7.9G  3.5G  4.0G  47% /
/dev/vdb        197G  5.3G  182G   3% /home
[root@ ~]# hdparm -Tt /dev/vda1 

/dev/vda1:
 Timing cached reads:   20212 MB in  2.00 seconds = 10122.68 MB/sec
 Timing buffered disk reads: 1926 MB in  3.00 seconds = 641.98 MB/sec
[root@~]# hdparm -Tt /dev/vdb 

/dev/vdb:
 Timing cached reads:   19774 MB in  2.00 seconds = 9903.22 MB/sec
 Timing buffered disk reads: 1884 MB in  3.00 seconds = 627.78 MB/sec

腾讯云硬盘与本地硬盘的对比

云硬盘 本地硬盘
约0.30元/GB月。 约0.30元/GB月。
可靠性更高:数据冗余存储,且分布在多台服务器。 数据冗余存储,分布在本服务器。
容量更大:最大支持4TB的数据盘。 最大支持500GB。
性能:顺序读写约60MBPS。 性能更高:顺序读写超过200MBPS。
选购云硬盘的服务器支持升级CPU,内存,硬盘容量及带宽升级。   选购本地盘的服务器不支持配置升级,仅支持带宽的升级。

详细参考:https://buy.cloud.tencent.com/price/cbs

2)ucloud系统盘(513.27 MB/sec)及云盘(256.60 MB/sec)IO读性能测试

[root@ ~]# hdparm -Tt /dev/vda1^C
[root@ ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/vda1       20641404 4259668  15333212  22% /
/dev/vdb        20642428 3620124  15973728  19% /data
[root@10-10-133-43 ~]# hdparm -Tt /dev/vda1

/dev/vda1:
 Timing cached reads:   14662 MB in  2.00 seconds = 7337.32 MB/sec
 Timing buffered disk reads: 1540 MB in  3.00 seconds = 513.27 MB/sec
[root@ ~]# hdparm -Tt /dev/vdb

/dev/vdb:
 Timing cached reads:   14728 MB in  2.00 seconds = 7370.36 MB/sec
 Timing buffered disk reads: 770 MB in  3.00 seconds = 256.60 MB/sec

Ucloud的Udisk没有公布磁盘详细IO情况:https://docs.ucloud.cn/storage_cdn/udisk/price.html

3)阿里云系统盘(51.57 MB/sec)、普通云盘(65.63 MB/sec)、高速云盘(57.05 MB/sec)IO读性能测试,SSD云盘99.78 MB/sec

[root@~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       40G  6.0G   32G  16% /
/dev/xvdc        99G   48G   46G  52% /home/mysql
/dev/xvdb       985G  317G  618G  34% /data

[root@~]# hdparm -Tt /dev/xvda1

/dev/xvda1:
 Timing cached reads:   14908 MB in  2.00 seconds = 7462.28 MB/sec
 Timing buffered disk reads: 156 MB in  3.03 seconds =  51.57 MB/sec
[root@iZ94fp4872nZ ~]# hdparm -Tt /dev/xvdb

/dev/xvdb:
 Timing cached reads:   14866 MB in  2.00 seconds = 7440.43 MB/sec
 Timing buffered disk reads: 198 MB in  3.02 seconds =  65.63 MB/sec


[root@]# hdparm -Tt /dev/xvdc

/dev/xvdc:
 Timing cached reads:   15070 MB in  2.00 seconds = 7541.93 MB/sec
 Timing buffered disk reads: 172 MB in  3.01 seconds =  57.05 MB/sec

阿里云盘SSD测试

# hdparm -Tt /dev/vda1

/dev/vda1:
 Timing cached reads:   16966 MB in  2.00 seconds = 8496.07 MB/sec
 Timing buffered disk reads: 300 MB in  3.01 seconds =  99.78 MB/sec

阿里云磁盘、SSD盘、搞笑云盘、普通云盘、本地SSD硬盘对比

块存储 SSD云盘 高效云盘 普通云盘 本地SSD盘
最大容量 2048 GB 2048 GB 2000 GB 800 GB
最大 IOPS 20000 3000 数百 12000
最大吞吐量 256 MBps 80 MBps 20 – 40 MBps 250 – 300 MBps
性能计算公式 IOPS=min{30*容量,20000}

吞吐量=min{50+0.5*容量,256}MBps
IOPS=min{1000+6*容量,3000}

吞吐量=min{50+0.1*容量,80}MBps
不适用 不适用
访问时延 0.5 – 2 ms 1 – 3 ms 5 – 10 ms 0.5 – 2 ms
数据可靠性 99.9999999% 99.9999999% 99.9999999% 仅物理机可靠性、无SLA保证
API名称 cloud_ssd cloud_efficiency cloud ephemeral_ssd
价格* 1.0元/GB/月 0.5元/GB/月 0.3元/GB/月 0.8元/GB/月
典型应用场景
  • I/O密集型应用
  • 中大型关系数据库
  • NoSQL数据库
  • 中小型数据库
  • 大型开发测试
  • Web服务器日志
不被经常访问或者低I/O负载的应用场景

Hadoop、NoSQL等分布式应用,应用本身有极高的可靠性,需要低时延、高I/O的存储。

供大家对云服务器的数据参考,2017.10.09增加普通电脑及服务器IO读写性能测试

1)DELL 1U PowerEdge R410服务器,RAID1 SAS 300G硬盘,测试比阿里云SSD云盘还要快。

# hdparm -Tt /dev/sda3

/dev/sda3:
 Timing cached reads:   11298 MB in  2.00 seconds = 5656.25 MB/sec
 Timing buffered disk reads:  442 MB in  3.01 seconds = 146.85 MB/sec

2)普通家庭电脑 希捷1T盘

# hdparm -Tt /dev/sda1

/dev/sda1:
 Timing cached reads:   19500 MB in  2.00 seconds = 9760.70 MB/sec
 Timing buffered disk reads: 436 MB in  3.01 seconds = 144.87 MB/sec

3)普通家庭电脑 西数4T盘

# hdparm -Tt /dev/sdb

/dev/sdb:
 Timing cached reads:   24872 MB in  2.00 seconds = 12455.68 MB/sec
 Timing buffered disk reads: 464 MB in  3.01 seconds = 154.13 MB/sec

linux centos 中OpenSSL升级方法详解

OpenSSL升级前段时间出现天大bug了,这样导致大家都急着去升级OpenSSL来初安全了,但是很多的朋友在家linux并不知道如何去升级OpenSSL了,下面我整理了一文章大家一起参考一下。

相关软件下载地址
Apache:http://httpd.apache.org/
Nginx:http://nginx.org/en/download.html
OpenSSL:http://www.openssl.org/
openssl-poc
附件说明
PoC.py : 漏洞利用测试PoC脚本
showssl.pl:OpenSSL动态库版本检测脚本
安装OpenSSL步骤

由于运营环境不同,以下过程仅供参考。openssl属于系统应用,被较多应用依赖,由于环境不同等因素,请先在测试环境进行充分测试。
从官方下载最新版本的opensssl库
wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz
解压下载的openssl压缩包
tar -zxvf openssl-1.0.1g.tar.gz
进入解压后的openssl文件夹
cd openssl-1.0.1g
执行文件夹中的config文件,这里openssl的安装目录默认是/usr/local/ssl(由于系统环境差异路径可能不一致,下同),注意添加zlib-dynamic参数,使其编译成动态库

 代码如下 复制代码
./config shared zlib-dynamic
config完成后执行 make 命令
make
make 命令执行完后再执行 make install 命令,安装openssl
make install
重命名原来的openssl命令
mv /usr/bin/openssl  /usr/bin/openssl.old
重命名原来的openssl目录
mv /usr/include/openssl  /usr/include/openssl.old
将安装好的openssl 的openssl命令软连到/usr/bin/openssl
ln -s /usr/local/ssl/bin/openssl  /usr/bin/openssl
将安装好的openssl 的openssl目录软连到/usr/include/openssl
ln -s /usr/local/ssl/include/openssl  /usr/include/openssl
修改系统自带的openssl库文件,如/usr/local/lib64/libssl.so(根据机器环境而定) 软链到升级后的libssl.so
ln -s /usr/local/ssl/lib/libssl.so /usr/local/lib64/libssl.so
执行命令查看openssl依赖库版本是否为1.0.1g:
strings /usr/local/lib64/libssl.so |grep OpenSSL
在/etc/ld.so.conf文件中写入openssl库文件的搜索路径
echo “/usr/local/ssl/lib” >> /etc/ld.so.conf
使修改后的/etc/ld.so.conf生效

ldconfig -v
查看现在openssl的版本是否是升级后的版本
openssl version
更新Webserver的 OpenSSL依赖库
如果webserver在安装编译时加载了openssl,还需对webserver进行重启或者重新编译操作。因webserver安装时分为动态编译和静态编译openssl两种方式,所以具体操作方式也不同。
判断webserver是否为动态编译ssl的两种方法

wget -c https://www.openssl.org/source/openssl-1.0.1s.tar.gz
tar -zxvf openssl-1.0.1s.tar.gz 
cd openssl-1.0.1s
./config shared zlib-dynamic
make && make install
mv /usr/bin/openssl  /usr/bin/openssl.old
mv /usr/include/openssl  /usr/include/openssl.old
ln -s /usr/local/ssl/bin/openssl  /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl  /usr/include/openssl
ln -s /usr/local/ssl/lib/libssl.so /usr/local/lib64/libssl.so
strings /usr/local/lib64/libssl.so |grep OpenSSL
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v
openssl version

通过ldd命令查看依赖库


ssl1

ldd查看程序依赖库,存在libssl.so则为动态编译ssl(如上图),反之为静态(如下图):

ssl2

查看编译参数
如输入以命令/usr/sbin/nginx -V,查看nginx的编译参数,参数中不存在–with-openssl则为动态编译ssl的,反之为静态:
ssl3

更新OpenSSL库
a) 如果webserver是动态编译ssl安装的,直接重启apache,nginx等相应webserver服务即可。
b) 如果webserver是静态编译ssl安装的,可参照以下方法更新:
apache静态编译ssl的情况:
源码重新安装apache,使用ssl静态编译:
执行apache的configure文件时,除了业务需要的参数外,需要指定ssl为静态编译

 代码如下 复制代码
./configure –enable-ssl=static –with-ssl=/usr/local/ssl
(openssl的安装路径)

安装apache

 代码如下 复制代码
make && make install

恢复原有apache配置,重启服务即可
nginx静态编译ssl的情况:
源码重新安装nginx,使用ssl静态编译:
执行nginx的configure文件时,除了业务需要的参数外,需要指定ssl为静态编译,编译参数带上–with-openssl便表明为静态编译ssl

 代码如下 复制代码
./configure  –with-http_ssl_module –with-openssl=/usr/local/ssl
(openssl的安装路径)

安装nginx

 代码如下 复制代码
make && make install

恢复原有nginx配置,重启服务即可
如有其他使用openssl的情况,参照apache和nginx的解决方式。
测试漏洞是否存在
使用附件PoC.py根据脚本提示检测是否存在漏洞。
如:
测试https://192.168.0.1漏洞是否存在执行命令如下

 代码如下 复制代码
python PoC.py -p 443,8443 192.168.0.1

检测动态库libssl.so版本
检测当前进程使用的libssl.so版本
执行附件showssl.pl检查脚本,无信息输出或无漏洞版本openssl输出,表示升级成功;如输出中有unknown,请业务自查libssl.so.1.0.0的版本是否是受影响的版本。
(详情见附件)

 代码如下 复制代码
#!/usr/bin/perl -w
my @listInfo = `lsof |grep libssl|awk ‘{print $1″ “$2” “$NF}’|sort -u`;
foreach my $info (@listInfo)
{
my ($procName, $procPid, $libPath) = split(/s/, $info);
next if (!defined($procName) || !defined($procPid)|| !defined($libPath));
my $version = `strings $libPath|grep -E “^OpenSSL [0-9]+.[0-9]+”`;
chomp $version;
if ($version =~ /s*OpenSSLs*1.0.1[a-f]{0,2}/)
{
print “$procName($procPid) : $libPath ($version).n”;
}
}

检测系统使用的libssl.so版本
执行命令:

 代码如下 复制代码
strings /usr/local/lib64/libssl.so |grep OpenSSL

查看openssl依赖库版本是否为1.0.1g
注:/usr/local/lib64/libssl.so 路径仅供参考,由具体机器环境决定,参考升级步骤

CentOS升级Git

Git现在的版本(我在写下本文时)已经是1.7.12了,然而CentOS的Git的版本却是1.7.1,而且用yum安装的Git的最高版本也只是去1.7.1,当然,如果你在工作使用中没有遇到问题,使用这个版本当然没有什么问题,但是如果你在工作中遇到只有高版本的Git才能支持的任务时,如何升级我们的Git呢?事实上,GitHub和许多Git服务依赖的Git版本不低于1.7.2。下面就以CentOS-6.5为例来说明,如何升级我们的Git。


一、安装证书
使用rpm的强大功能,从以下的地址中,导入安装所需要的证书,命令如下:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt  

二、安装RPMForge
RPMForge源是什么呢?RPMForgeCentOS系统下的软件仓库,拥有4000多种的软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓库。而CentOS默认自带CentOS-Base.repo源,但官方源中去除了很多有版权争议的软件,而且安装的软件也不是最新的稳定版。所以在这里,我们使用这个rpm软件仓库。其地址如下:

因为不同的CentOS版本的Git所对应的rpm包不同,所以在下载安装RPMForge时可先到该网站找到适合自己系统安装的RPMForgerpm。其地址如下:


因为我的CentOS是CentOS-6.5 32 位,所以我对应的rpm安装包就是:rpmforge-release-0.5.3-1.el6.rf.i686.rpm,所以可用以下命令来安装:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # rpm -i http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm  
通过rpm的在线安装功能,我们也可以不下载rpm包,而直接在线安装

三、使用rpmforge-extra源更新
因为yum命令下载的软件依赖于其所使用的软件仓库,所以我们只要更改其指定的软件仓库,就能使用yum来方便地下载安装RPMForge源中的软件来更新本机的软件,从而简化安装操作。其命令如下:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # yum –enablerepo=rpmforge-extras update  
你会看到由于软件仓库的切换,导致会有大量的软件可更新,你可以选择安装或不安装。若选择安装,则输入‘y’,那么当安装完成时,Git也就变为最新的版本了,我就是用这种方式的。但由于要更新的软件实在太多,所以,也可以选择只安装Git,输入了‘n’。

注:上面的命令其实与yum update是一样的,只是上面的命令指定更新对比的软件仓库为RPMForge。经过我的观察,选项–enablerepo=rpmforge-extras并不会改变yum的默认软件仓库,所以每次要想从下载软件,都需要该选项。要想一直使用第三方的源,应需要安装yum-priorities插件,并配置相关文件/etc/yum.repos.d/CentOS-Base.repo。(这里如有错误还望指出)

四、查看可用的git模块
由于我们并不知道,我们的系统可以安装哪些版本的Git,所以可用如下命令来查看,并选择一个最新版本的git来安装。其命令如下:

[cpp] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # yum –enablerepo=rpmforge-extras provides git  
五、安装Git
由于我们使用的是RPMForge的软件仓库,所以在安装时,如果没有运行上第四点的命令,而又想知道,自己的系统应该选择哪个版本来安装,我们可以到其仓库中找到我们版本所对应的Git,其地址如下:

由于我的是CentOS-6,所以最新的就是gitk-1.7.12.4-1.el6.rfx.i686.rpm了。

其命令如下:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # yum –enablerepo=rpmforge-extras install gitk-1.7.12.4-1.el6.rfx.i686.rpm  
六、版本检查
至此,我们的Git已经升级好了,旧的Git会被新的覆盖,我们可以通过如下命令来查看,git的版本:

[plain] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # git –version  

[cpp] view plain copy

 print?在CODE上查看代码片派生到我的代码片

  1. # rpm -q git  

CentOS如何升级 Subversion (SVN) 1.8.15

感谢WANdisco,是维持最新的颠覆版的RPM包。这篇文章将帮助您安装Subversion(SVN)1.8.15 CentOS / RHEL 7 / 6 / 5系统。如果要配置颠覆服务器访问本文。

Thanks to Wandisco, which is maintaining the rpm packages for latest Subversion version. This article will help you to Install Subversion 1.8.15 ( SVN Client ) on CentOS/RHEL 7/6/5 Systems. If you want to configure Subversion server visit this article.

Step 1: Setup Yum Repository

首先,我们需要在我们的系统中配置yum仓库。创建一个新的回购文件/ etc / yum.repos.d/wandisco-svn.repo并添加以下内容按你的操作系统版本。

Firstly we need to configure yum repository in our system. Create a new repo file/etc/yum.repos.d/wandisco-svn.repo and add following content as per your operating system version.

[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.8/RPMS/$basearch/
enabled=1
gpgcheck=0

Step 2: Install Subversion Package

Before installing latest package remove existing subversion packages from system to remove conflict.

在安装最新方案之前,从系统中删除现有的颠覆软件,以消除冲突。

# yum remove subversion*

Now install latest available Subversion package using yum command line package manager utility.现在安装新的颠覆包使用yum命令行软件包管理器。

# yum clean all
# yum install subversion

Step 3: Verify Subversion Version

At this stage you have successfully install Subversion client on your system. Lets use following command to verify version of svn client.在这个阶段,您已经成功地安装了系统的颠覆客户端。让我们用以下命令来验证SVN客户端版本。

# svn --version


svn, version 1.8.15 (r1718365)
   compiled Dec 11 2015, 14:28:48 on x86_64-redhat-linux-gnu

Copyright (C) 2015 The Apache Software Foundation.
This software consists of contributions made by many people;
see the NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/

The following repository access (RA) modules are available:

* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
  - using serf 1.3.7
  - handles 'http' scheme
  - handles 'https' scheme

References: 
1. http://opensource.wandisco.com/

在Linux CentOS 6.6上升级Python 2.7.9

CentOS 6.6自带的是Python 2.6.6,而编译llvm需要Python 2.7以上,必须升级Python 

checking for python... /usr/bin/python
checking for python >= 2.7... not found
configure: error: found python 2.6.6 (/usr/bin/python); required >= 2.7

yum中最新的也是Python 2.6.6,只能下载Python 2.7.9的源代码自己编译安装。

操作步骤如下:

1)安装devtoolset

yum groupinstall "Development tools"

2)安装编译Python需要的包包

yum install zlib-devel
yum install bzip2-devel
yum install openssl-devel
yum install ncurses-devel
yum install sqlite-devel

3)下载并解压Python 2.7.9的源代码

cd /opt
wget --no-check-certificate https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
tar xf Python-2.7.9.tar.xz
cd Python-2.7.9

4)编译与安装Python 2.7.9

./configure --prefix=/usr/local
make && make altinstall

5)将python命令指向Python 2.7.9

ln -s /usr/local/bin/python2.7 /usr/local/bin/python

6)检查Python版本

sh
sh-4.1# python -V
Python 2.7.9

如何用十条命令在一分钟内检查Linux服务器性能

通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解。

  • uptime

  • dmesg | tail

  • vmstat 1

  • mpstat -P ALL 1

  • pidstat 1

  • iostat -xz 1

  • free -m

  • sar -n DEV 1

  • sar -n TCP,ETCP 1

  • top

其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。

下面我们来逐一介绍下这些命令,有关这些命令更多的参数和说明,请参照命令的手册。

uptime

$ uptime 23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。

dmesg丨tail

$ dmesg | tail [1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 [...] [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB [2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。

vmstat 1

$ vmstat 1 procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0 32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0 32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0 32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0 32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0 ^C

vmstat(8) 命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:

  • r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。

  • free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。

  • si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。

  • us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。

上述这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

示例命令的输出可以看见,大量CPU时间消耗在用户态,也就是用户应用程序消耗了CPU时间。这不一定是性能问题,需要结合r队列,一起分析。

mpstat-P ALL 1

$ mpstat -P ALL 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU) 07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle 07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78 07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99 07:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.00 07:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.00 07:38:50 PM    3  96.97   0.00   0.00    0.00   0.00   0.00    0.00    0.00    0.00   3.03 [...]

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

pidstat 1

$ pidstat 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU) 07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command 07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0 07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave 07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java 07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java 07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java 07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat 07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command 07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave 07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java 07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass 07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat ^C

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。

iostat-xz 1

$ iostat -xz 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU) avg-cpu:  %user   %nice %system %iowait  %steal   %idle          73.96    0.00    3.73    0.03    0.06   22.21 Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util xvda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09 xvdb        0.01     0.00    1.02    8.94   127.97   598.53   145.79     0.00    0.43    1.78    0.28   0.25   0.25 xvdc        0.01     0.00    1.02    8.86   127.79   595.94   146.50     0.00    0.45    1.82    0.30   0.27   0.26 dm-0        0.00     0.00    0.69    2.32    10.47    31.69    28.01     0.01    3.23    0.71    3.98   0.13   0.04 dm-1        0.00     0.00    0.00    0.94     0.01     3.78     8.00     0.33  345.84    0.04  346.81   0.01   0.00 dm-2        0.00     0.00    0.09    0.07     1.35     0.36    22.50     0.00    2.55    0.23    5.62   1.78   0.03 [...] ^C

iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:

  • r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。

  • await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。

  • avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。

  • %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free -m

$ free -m             total       used       free     shared    buffers     cached Mem:        245998      24545     221453         83         59        541 -/+ buffers/cache:      23944     222053 Swap:            0          0          0

free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需要注意的是,第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

sar -n DEV 1

$ sar -n DEV 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU) 12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil 12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00 12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00 12:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00 12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil 12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.00 12:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.00 12:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00 ^C

sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。如示例输出中,eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU) 12:17:19 AM  active/s passive/s    iseg/s    oseg/s 12:17:20 AM      1.00      0.00  10233.00  18846.00 12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s 12:17:20 AM      0.00      0.00      0.00      0.00      0.00 12:17:20 AM  active/s passive/s    iseg/s    oseg/s 12:17:21 AM      1.00      0.00   8359.00   6039.00 12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s 12:17:21 AM      0.00      0.00      0.00      0.00      0.00 ^C

sar命令在这里用于查看TCP连接状态,其中包括:

  • active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;

  • passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;

  • retrans/s:每秒TCP重传数量;

TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

top

$ top top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92 Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie %Cpu(s): 96.8 us,  0.4 sy,  0.0 ni,  2.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 20248 root      20   0  0.227t 0.012t  18748 S  3090  5.2  29812:58 java  4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top  5235 root      20   0 38.227g 547004  49996 S   0.7  0.2   2:02.74 java  4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java     1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd     3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 ksoftirqd/0     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H     6 root      20   0       0      0      0 S   0.0  0.0   0:06.94 kworker/u256:0     8 root      20   0       0      0      0 S   0.0  0.0   2:38.05 rcu_sched

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

总结

排查Linux服务器性能问题还有很多工具,上面介绍的一些命令,可以帮助我们快速的定位问题。例如前面的示例输出,多个证据证明有JAVA进程占用了大量CPU资源,之后的性能调优就可以针对应用程序进行。

在CentOS上编译安装FFmpeg,一键安装脚本

在CentOS编译安装ffmpeg比较麻烦,以前也搞过多次,由于博客调整,特重新记录一下,以备不时之需。

使用yum安装ffmpeg和相关软件

快速安装 ffmpeg

直接安装:

1 
yum install ffmpeg ffmpeg-devel 

若没有找到相应包,需要先加入要应的包。

将下列代码命名为 dag.repo 放在 /etc/yum.repos.d 目录 下。

1 2 3 4 5 
[dag] name=Dag RPM Repository for Red Hat Enterprise Linux baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag gpgcheck=1 enabled=1 

然后再执行上方的安装命令。

安装 ffmpeg-php 扩展

1 2 3 4 5 6 
wget /path/to/this/file/ffmpeg-php-0.5.2.1.tbz2 tar -xjf ffmpeg-0.5.2.1.tbz2 phpize ./configure make make install 

修改 php.ini 文件

安装完成后,将会在/usr/local/lib/php/extensions/no-debug-non-zts-20060613/ffmpeg.so 看到php扩展文件。

打开php.ini文件,加入下面两行

1 2 
[ffmpeg] extension=ffmpeg.so 

重启WEB服务器。使用phpinfo即可看到ffmpeg相关信息。

1 2 3 4 5 6 7 
// #test.php  <?php  phpinfo()  ?> 

php 使用方法

1 2 3 4 5 6 7 8 9 10 
<?php $extension = "ffmpeg"; $extension_soname = $extension . "." . PHP_SHLIB_SUFFIX; $extension_fullname = PHP_EXTENSION_DIR . "/" . $extension_soname;  // load extension if(!extension_loaded($extension)) {  dl($extension_soname) or die("Can't load extension $extension_fullname\n"); } ?> 

安装 Mplayer 和 Mencoder

1 
yum install mplayer mencoder 

常见问题

常见问题及解决方案请参考这里:http://www.mysql-apache-php.com/ffmpeg-install.htm

自行编译安装 ffmpeg

安装依赖项

1 
yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel 

安装相应软件包

可以建立目录存放软件包

1 
mkdir ~/ffmpeg_sources 

注意:以下软件包请有选择的安装,如果不需要请在./configure时移除或关闭相关选项

安装 yasm

Yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集。 x264 和 FFmpeg都使用Yasm.

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources git clone --depth 1 git://github.com/yasm/yasm.git cd yasm autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" make make install make distclean 

1 2 3 4 5 6 7 8 
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar zxf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" make make install make distclean . ~/.bash_profile 

安装 x264

H.264 编码器。http://trac.ffmpeg.org/wiki/Encode/H.264

1 2 3 4 5 6 7 
cd ~/ffmpeg_sources git clone --depth 1 git://git.videolan.org/x264 cd x264 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static make make install make distclean 

1 2 3 4 5 6 7 
wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 tar jxf last_x264.tar.bz2 cd x264-snapshot-20130311-2245/ ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-shared make make install make distclean 

需要ffmpeg配置./configure --enable-gpl --enable-libx264

注:由于libx264的code有GPL信息,所以,支持libx264时,需要—enable-gpl,ffmpeg在license方面还是比我们国内的人更重视

安装 x265

H.265/HEVC编码器.http://trac.ffmpeg.org/wiki/Encode/H.265

1 2 3 4 5 6 
cd ~/ffmpeg_sources hg clone https://bitbucket.org/multicoreware/x265 cd ~/ffmpeg_sources/x265/build/linux cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source make make install 

需要ffmpeg配置./configure --enable-gpl --enable-libx265

安装 libfdk_aac

AAC音频编码器,Fraunhofer AAC library

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac cd fdk-aac autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --enable-shared make make install make distclean 

需要ffmpeg配置--enable-libfdk_aac ,如果指定了--enable-gpl还要配置--enable-nonfree

安装 libmp3lame

Mp3音频编码器

1 2 3 4 5 6 7 
wget http://iweb.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz tar zxf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-shared --enable-nasm make make install make distclean 

需要ffmpeg配置--enable-libmp3lame

安装 libopus

Opus 音频编解码器

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources git clone git://git.opus-codec.org/opus.git cd opus autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --disable-shared make make install make distclean 

1 2 3 4 5 6 7 
wget http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz tar zxf opus-1.0.3.tar.gz cd opus-1.0.3 ./configure --prefix="$HOME/ffmpeg_build" --enable-shared make make install make distclean 

需要ffmpeg配置--enable-libopus

安装 libogg库

libogg是Ogg流库,libtheora、libvorbis需要libogg库,speex需要它。

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources curl -O http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz tar xzvf libogg-1.3.2.tar.gz cd libogg-1.3.2 ./configure --prefix="$HOME/ffmpeg_build" --disable-shared make make install make distclean 

安装 libvorbis库

Vorbis音频编码器,需要libogg库。http://trac.ffmpeg.org/wiki/CompilationGuide/Centos#libogg

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources curl -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz tar xzvf libvorbis-1.3.4.tar.gz cd libvorbis-1.3.4 LDFLAGS="-L$HOME/ffmeg_build/lib" CPPFLAGS="-I$HOME/ffmpeg_build/include" ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared make make install make distclean 

需要ffmpeg配置--enable-libvorbis

安装 libvpx

VP8/VP9视频编码器

1 2 3 4 5 6 7 
cd ~/ffmpeg_sources git clone --depth 1 http://git.chromium.org/webm/libvpx.git cd libvpx ./configure --prefix="$HOME/ffmpeg_build" --enable-examples make make install make clean 

需要ffmpeg配置--enable-libvpx

编译安装 ffmpeg

1 2 3 4 5 6 7 8 
cd ~/ffmpeg_sources git clone --depth 1 git://source.ffmpeg.org/ffmpeg cd ffmpeg PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 make make install make distclean hash -r 

注:

  • 编译完成后ffmpeg,ffprobe,ffserver,lame,x264都可以使用。
  • 编译安装时可以参考Windows Build:http://ffmpeg.zeranoe.com/builds/
  • 如果还需要持续更新请保留ffmpeg_sources目录。

其它可选软件包

安装 OpenCORE AMR

1 2 3 4 5 
wget http://iweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.3.tar.gz tar zxf opencore-amr-0.1.3.tar.gz ./configure --prefix="$HOME/ffmpeg_build" –enable-shared make make install 

需要ffmpeg配置--enable-libopencore-amrnb 和/或 --enable-libopencore-amrwb

安装 VisualOn AAC

注:github的tag和master版均无法autoconf,用zeranoe版代替

1 2 3 4 5 6 7 
wget wget http://ffmpeg.zeranoe.com/builds/source/external_libraries/vo-aacenc-0.1.3.tar.xz xz -d vo-aacenc-0.1.3.tar.xz tar xf vo-aacenc-0.1.3.tar cd vo-aacenc-0.1.3 ./configure --prefix="$HOME/ffmpeg_build"  make make install 

也可

1 
wget http://iweb.dl.sourceforge.net/project/opencore-amr/vo-aacenc/vo-aacenc-0.1.3.tar.gz 

需要ffmpeg配置--enable-libvo-aacenc

安装 VisualOn AMR-WB

注:github的tag和master版均无法autoconf,用zeranoe版代替

1 2 3 4 5 
wget http://ffmpeg.zeranoe.com/builds/source/external_libraries/vo-amrwbenc-0.1.2.tar.xz xz -d vo-amrwbenc-0.1.2.tar.xz tar xf vo-amrwbenc-0.1.2.tar cd vo-amrwbenc-0.1.2 ./configure --prefix="$HOME/ffmpeg_build" 

需要ffmpeg配置--enable-libvo-amrwbenc

安装 frei0r

先安装新版autoconf,这会覆盖掉系统中的旧版本哦

1 2 3 4 5 6 
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz tar zxf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix="$HOME/ffmpeg_build"  make make install 
1 2 3 4 5 6 
wget http://files.dyne.org/frei0r/releases/frei0r-plugins-1.4.tar.gz tar zxf frei0r-plugins-1.4.tar.gz cd frei0r-plugins-1.4 ./configure --prefix="$HOME/ffmpeg_build"  make make install 

安装 gnutls

注意:/etc/ld.so.conf要加上lib64。并且不要使用yum remove gnutls gnutls-devel

首先安装nettle:

1 2 3 4 5 6 
wget http://www.lysator.liu.se/~nisse/archive/nettle-2.5.tar.gz tar zxf nettle-2.5.tar.gz cd nettle-2.5 ./configure --prefix="$HOME/ffmpeg_build" –enable-shared make make install 

然后安装gnutls新版:

1 2 3 4 5 6 7 
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.9.1.tar.xz xz -d gnutls-3.1.9.1.tar.xz tar xf gnutls-3.1.9.1.tar cd gnutls-3.1.9.1 PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure –enable-shared make make install 

安装 rtmpdump

1 2 3 4 5 
wget http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz tar zxf rtmpdump-2.3.tgz cd rtmpdump-2.3 make make install 

安装 schroedinger

注:先安装好orc库

1 2 3 4 5 6 7 
wget http://code.entropywave.com/download/orc/orc-0.4.17.tar.gz tar zxf orc-0.4.17.tar.gz cd orc-0.4.17 ./configure --prefix="$HOME/ffmpeg_build"  make make install /sbin/ldconfig 
1 2 3 4 5 6 
wget http://diracvideo.org/download/schroedinger/schroedinger-1.0.11.tar.gz tar zxf schroedinger-1.0.11.tar.gz cd schroedinger-1.0.11 PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure make make install 

安装 soxr

注:新版libsoxr貌似与当前ffmpeg不兼容,用旧版

1 2 3 4 5 6 7 8 9 10 
yum install -y xz wget http://hivelocity.dl.sourceforge.net/project/soxr/soxr-0.1.0-Source.tar.xz xz -d soxr-0.1.0-Source.tar.xz tar xf soxr-0.1.0-Source.tar cd soxr-0.1.0-Source ./go cd Release/ make make install /sbin/ldconfig 

安装 speex

音频编码解码器。需要安装libogg库

1 
yum install speex-devel 

1 2 3 4 5 6 
wget http://downloads.xiph.org/releases/speex/speex-1.2rc1.tar.gz tar zxf speex-1.2rc1.tar.gz cd speex-1.2rc1 ./configure --prefix="$HOME/ffmpeg_build"  make make install 

ffmpeg ./configure 添加 --enable-libspeex

安装 libfreetype

字体呈现库,使用drawtext http://ffmpeg.org/ffmpeg-filters.html#drawtext-1

1 
yum install freetype-devel 

ffmpeg ./configure 添加 --enable-libfreetype

安装 libsdl库

1 2 3 4 5 6 7 
wget http://www.libsdl.org/release/SDL-1.2.15.tar.gz tar zxf SDL-1.2.15.tar.gz cd SDL-1.2.15 ./configure --prefix="$HOME/ffmpeg_build"  make make install /sbin/ldconfig 

安装 theora

Theora视频编码器,需要需要libogg,libvorbis和libsdl库

1 2 3 4 5 6 
wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2 tar zjf libtheora-1.1.1.tar.bz2 ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-examples --enable-shared --disable-sdltest --disable-vorbistest make make install make distclean 

ffmpeg ./configure 添加 --enable-libtheora

安装 twolame

1 2 3 4 5 6 7 8 
wget http://downloads.sourceforge.net/twolame/twolame-0.3.13.tar.gz tar zxf twolame-0.3.13 .tar.gz cd twolame-0.3.13 ./configure --prefix="$HOME/ffmpeg_build"  make make install /sbin/ldconfig 

安装 xvid

1 2 3 4 5 6 7 
wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz tar zxf xvidcore-1.3.2.tar.gz cd xvidcore cd build/generic ./configure --prefix="$HOME/ffmpeg_build"  make make install 

更新FFmpeg及相关组件

更新依赖项

删除旧文件,更新依赖项

1 2 
rm -rf ~/ffmpeg_build ~/bin/{ffmpeg,ffprobe,ffserver,lame,vsyasm,x264,yasm,ytasm} # yum install autoconf automake cmake gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel 

更新 x264

1 2 3 
cd ~/ffmpeg_sources/x264 make distclean git pull 

然后运行

1 2 3 4 
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static make make install make distclean 

更新 x265

1 2 3 4 
cd ~/ffmpeg_sources/x265 rm -rf ~/ffmpeg_sources/x265/build/linux/* hg update cd ~/ffmpeg_sources/x265/build/linux 

然后运行

1 2 3 
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source make make install 

更新 libfdk_aac

1 2 3 
cd ~/ffmpeg_sources/libfdk_aac make distclean git pull 

然后运行

1 2 3 4 5 6 
cd fdk-aac autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --disable-shared make make install make distclean 

更新 libvpx

1 2 3 
cd ~/ffmpeg_sources/libvpx make clean git pull 

然后运行

1 2 3 4 5 
cd libvpx ./configure --prefix="$HOME/ffmpeg_build" --disable-examples make make install make clean 

更新FFmpeg

1 2 3 
cd ~/ffmpeg_sources/ffmpeg make distclean git pull 

然后运行

1 2 3 4 5 6 
cd ffmpeg PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 make make install make distclean hash -r 

还原所有本文安装内容

1 2 3 
rm -rf ~/ffmpeg_build ~/ffmpeg_sources ~/bin/{ffmpeg,ffprobe,ffserver,lame,vsyasm,x264,yasm,ytasm} # yum erase autoconf automake cmake gcc gcc-c++ git libtool mercurial nasm pkgconfig zlib-devel hash -r 

注:如安装其它软件包需要自行删除

自动安装shell

https://gist.github.com/gboudreau/f24aed76b4cc91bfb2c1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 
#!/bin/sh   # Based on instructions found here: http://wiki.razuna.com/display/ecp/FFMpeg+Installation+on+CentOS+and+RedHat#FFMpegInstallationonCentOSandRedHat-InstallX264   if [ "`/usr/bin/whoami`" != "root" ]; then  echo "You need to execute this script as root."  exit 1 fi   cat > /etc/yum.repos.d/centos.repo<<EOF [centos] name=CentOS-6 – Base baseurl=http://mirror.centos.org/centos/6/os/x86_64/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6 enabled=1 priority=1 protect=1 includepkgs=SDL SDL-devel gsm gsm-devel libtheora theora-tools libdc1394 libdc1394-devel libraw1394-devel EOF rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6   rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm yum -y update   yum -y install glibc gcc gcc-c++ autoconf automake libtool git make nasm pkgconfig yum -y install SDL-devel a52dec a52dec-devel alsa-lib-devel faac faac-devel faad2 faad2-devel yum -y install freetype-devel giflib gsm gsm-devel imlib2 imlib2-devel lame lame-devel libICE-devel libSM-devel libX11-devel yum -y install libXau-devel libXdmcp-devel libXext-devel libXrandr-devel libXrender-devel libXt-devel yum -y install libogg libvorbis vorbis-tools mesa-libGL-devel mesa-libGLU-devel xorg-x11-proto-devel zlib-devel yum -y install libtheora theora-tools yum -y install ncurses-devel yum -y install libdc1394 libdc1394-devel yum -y install amrnb-devel amrwb-devel opencore-amr-devel   cd /opt wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz tar xzvf xvidcore-1.3.2.tar.gz && rm -f xvidcore-1.3.2.tar.gz cd xvidcore/build/generic ./configure --prefix="$HOME/ffmpeg_build" && make && make install   cd /opt wget http://downloads.xiph.org/releases/ogg/libogg-1.3.1.tar.gz tar xzvf libogg-1.3.1.tar.gz && rm -f libogg-1.3.1.tar.gz cd libogg-1.3.1 ./configure --prefix="$HOME/ffmpeg_build" --disable-shared && make && make install   cd /opt wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz tar xzvf libvorbis-1.3.4.tar.gz && rm -f libvorbis-1.3.4.tar.gz cd libvorbis-1.3.4 ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared && make && make install   cd /opt wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.gz tar xzvf libtheora-1.1.1.tar.gz && rm -f libtheora-1.1.1.tar.gz cd libtheora-1.1.1 ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-examples --disable-shared --disable-sdltest --disable-vorbistest && make && make install   cd /opt wget http://downloads.sourceforge.net/opencore-amr/vo-aacenc-0.1.2.tar.gz tar xzvf vo-aacenc-0.1.2.tar.gz && rm -f vo-aacenc-0.1.2.tar.gz cd vo-aacenc-0.1.2 ./configure --prefix="$HOME/ffmpeg_build" --disable-shared && make install   yum -y remove yasm cd /opt wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz tar xzfv yasm-1.2.0.tar.gz && rm -f yasm-1.2.0.tar.gz cd yasm-1.2.0 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && make install export "PATH=$PATH:$HOME/bin"    cd /opt git clone http://git.chromium.org/webm/libvpx.git cd libvpx git checkout tags/v1.3.0 ./configure --prefix="$HOME/ffmpeg_build" --disable-examples && make && make install   cd /opt git clone git://git.videolan.org/x264.git cd x264 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static && make install   export LD_LIBRARY_PATH=/usr/local/lib/:$HOME/ffmpeg_build/lib/ echo /usr/local/lib >> /etc/ld.so.conf.d/custom-libs.conf echo $HOME/ffmpeg_build/lib/ >> /etc/ld.so.conf.d/custom-libs.conf ldconfig   cd /opt git clone git://source.ffmpeg.org/ffmpeg.git cd ffmpeg git checkout release/2.2 PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" export PKG_CONFIG_PATH ./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" \ --extra-libs=-ldl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvpx --enable-libfaac \ --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvo-aacenc --enable-libxvid --disable-ffplay \ --enable-gpl --enable-postproc --enable-nonfree --enable-avfilter --enable-pthreads --arch=x86_64 && make install   # Test the resulting ffmpeg binary cp $HOME/bin/ffmpeg /usr/bin/ ffmpeg -v 

参考

原文:http://www.yaosansi.com/post/ffmpeg-on-centos

RTMP与HLS压力测试工具安装与配置

服务器负载测试工具(st-load):

1. 模拟huge并发:2G内存就可以开300k连接。基于states-threads的协程。

2. 支持HLS解析和测试,下载ts片后等待一个切片长度,模拟客户端。支持HLS点播和直播。

3. 支持HTTP负载测试,所有并发重复下载一个http文件。可将80Gbps带宽测试的72Gbps。

4. 支持RTMP流测试,一个进程支持5k并发。使用nginx-rtmp的协议直接将chunk流解析为messgae。

state-threads用来模拟超级并发,并简化异步socket的逻辑为同步socket,http-parser解析http协议部分。

这两个库设计都很巧妙,所以我开了一个项目:https://github.com/winlinvip/st-load

state-threads之前就有写过文章说明,那时候主要是支持高并发的rtmp服务器,也是并发和异步变为同步的协程很方便。

http-parser用yum就可以search到,它其实设计得也相当巧妙,相当于只是解析buffer的http内容,并不负责网络部分。libcurl/poco等都带了网络处理,所以不合适。

举例说明,http_parser_parse_url这个函数,解析url,设计得非常有意思,不是返回字符串,而是返回位置索引,譬如主机头在什么位置长度多长等等。

[root@localhost ~]# yum install git unzip patch gcc gcc-c++ make
[root@localhost ~]# git clone https://github.com/winlinvip/st-load.git

[root@localhost st-load]# ./configure
[root@localhost st-load]# make

[root@localhost st-load]# ls objs/
http-parser-2.1 src st_hls_load st_rtmp_load st_rtmp_publish
Makefile st-1.9 st_http_load st_rtmp_load_fast
[root@localhost st-load]#
模拟RTMP用户
./st_rtmp_load -c 1 -r rtmp://127.0.0.1:1935/live/livestream
模拟HLS直播用户
./st_hls_load -c 1 -r http://127.0.0.1:3080/hls/hls.m3u8
模拟HSL点播用户
./st_hls_load -c 10000 -o -r http://127.0.0.1:3080/hls/hls.m3u8
模拟RTMP推流用户
./st_rtmp_publish -i doc/source.200kbps.768×320.flv -c 1 -r rtmp://127.0.0.1:1935/live/livestream
模拟RTMP多路推流用户
./st_rtmp_publish -i doc/source.200kbps.768×320.flv -c 1000 -r rtmp://127.0.0.1:1935/live/livestream_{i}

支持RTMP流播放测试,一个进程支持5k并发
支持RTMP流推流测试,一个进程支持500个并发。

Nginx搭建hls流媒体服务器

第一种方案:ffmpeg+nginx

 
新的ffmpeg已经支持HLS。(本人也参与了代码供献,给自己做个广告:))
 
点播:
生成hls分片:
ffmpeg -i <媒体文件> -c:v libx264 -c:a -f hls /usr/local/nginx/html/test.m3u8 
直播:
ffmpeg -i udp://@:1234 -c:v libx264 -c:a -f hls  /usr/local/nginx/html/test.m3u8
建立web服务器:
默认配置就可以。
 server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
 
}
 
 
 
启动nginx。
 
客户端访问:http://IP/test.m3u8
 
在windows上可以用vlc播放。
 
 
 
第二个文案,用nginx-rtmp-module
 
      
rtmp {
 
    server {
 
        listen 1935;
 
        chunk_size 4000;
      
        #HLS
 
        # For HLS to work please create a directory in tmpfs (/tmp/app here)
        # for the fragments. The directory contents is served via HTTP (see
        # http{} section in config)
        #
        # Incoming stream must be in H264/AAC. For iPhones use baseline H264
        # profile (see ffmpeg example).
        # This example creates RTMP stream from movie ready for HLS:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  –vcodec libx264 
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # If you need to transcode live stream use ‘exec’ feature.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/app;
            hls_fragment 5s;
        }
    }
}
 
http {
 
    server {
 
        listen      80;
        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias /tmp/app;
            expires -1;
        }
    }
}

直播及点播的视频码率,帧率和分辨率关系与区别

直播及点播视频码率,帧率和分辨率到底哪一个影响电影的清晰度

码率:影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。

码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。也就是取样率(并不等同与采样率,采样率的单位是Hz,表示每秒采样的次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来cbr(固定码率)与vbr(可变码率), “码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。

下面是通过一个wav文件的采样率来计算码率和文件大小,通过MediaInfo工具显示的文件信息如下:

概要

完整名称                             :audio\wav\adele-rolling_in_the_deep.wav

文件格式                             : Wave

文件大小                             : 38.3 MiB

长度                                    : 3分 47秒

平均混合码率                     : 1 411 Kbps

 

音频

ID                                         : 0

文件格式                             : PCM

格式设置,Endianness      : Little

编码设置ID                          : 1

编码设置ID/提示信息         : Microsoft

长度                                      : 3分 47秒

码率                                      : 1 411.2 Kbps

声道                                     : 2声道

采样率                                 : 44.1 KHz

位深度                                 : 16位

大小                                     : 38.3 MiB (100%)

 

1.码率计算公式:

码率=采样率 x 位深度 x 声道

所以,上面文件的码率= 44.1Khz x 16位 x 2声道 = 1411.2 Kbps

 

2.文件大小 = 码率 x 时长 = 1411.2 Kbps x (3 x 60 + 47 )s = 1411.2Kbps x 227s

 =38102.4 Kb

38102.4 Kb / 1024 Kb/M = 37.2M

近似等于mediainfo工具显示的文件大小38.3M。

注:此计算公式对未压缩的wav格式文件有效,不适用于mp3等被压缩的文件。

帧率:影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。

帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,

分辨率:影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。

清晰度

在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。

 

带宽、帧率

例如在ADSL线路上传输图像,上行带宽只有512Kbps,但要传输4路CIF分辨率的图像。按照常规,CIF分辨率建议码率是512Kbps,那么照此计算就只能传一路,降低码率势必会影响图像质量。那么为了确保图像质量,就必须降低帧率,这样一来,即便降低码率也不会影响图像质量,但在图像的连贯性上会有影响。