Linux性能监控之vmstat和dstat

本文链接:https://blog.csdn.net/smooth00/article/details/78623728
说来惭愧,做了这么久的性能测试,居然对linux的vmstat这个命令还不熟悉,对很多指标的具体意义都有点模糊不清,今天花了点时间好好学习、整理一下这个命令的相关资料。因为这个命令确实比较重要,而且频繁用到。顺便再介绍一下另一个更强大的工具dstat。

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、IO读写、CPU活动等进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

命令语法:
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

命令参数:

不同版本Linux的cp命令参数有可能不同。不过默认应该都是[ delay [ count ] ] ,delay是间隔,count显示多少次信息。可以和上面的某些参数结合使用。

参数

英文描述

描叙

delay

刷新时间间隔。如果不指定,只显示一条结果。

count

刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

-a

The -a switch displays active/inactive memory, given a 2.5.41 kernel or better.

开启显示active/inactive memory。

-f

The -f switch displays the number of forks since boot. This includes the fork, vfork, and clone system calls, and is equivalent to the total number of tasks created. Each process is represented by one or more tasks, depending on thread usage. This display does not repeat.

显示此系统启动以来的forks的总数,包括fork、vfork和clone system calls

-m

The -m displays slabinfo

显示slabinfo信息

-n

The -n switch causes the header to be displayed only once rather than periodically.

只显示头信息,不周期性显示.也就是说开启这个参数,只显示头部信息一次。

-s

The -s switch displays a table of various event counters and memory statistics. This display does not repeat.

显示各种事件计数器表和内存统计信息,这显示不重复。

-d

The -d reports disk statistics (2.5.70 or above required)

显示磁盘统计数据(内核要求2.5.70 或以上)

-w

The -w enlarges field width for big memory sizes

可以扩大字段长度,当内存较大时,默认长度不够完全展示内存。

-p

The -p followed by some partition name for detailed statistics (2.5.70 or above required)

显示磁盘分区数据(disk partition statistics )

-S

The -S followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes

参数S控制输出性能指标的单位,k(1000) K(1024) 或 M(1048576) 默认单位为K(1024 bytes)

-V

The -V switch results in displaying version information.

查看vmstat命令的版本

我们常用的示例是(每隔3秒刷新一次):

vmstat -n 3

vmstat -a 3

vmstat -w 3

输出字段的意义:

这块是我一直也记不住的地方,所以特别整理了下面一张表,部分参考网上的说明,部分根据自己的理解进行补充。

输出列

输出列说明

输出列详细说明

Procs

r

The number of processes waiting for run time

等待运行的进程数。如果等待运行的进程数越多,意味着CPU非常繁忙。另外,如果该参数长期大于和等于逻辑cpu个数,则CPU资源可能存在较大的瓶颈。

b

The number of processes in uninterruptible sleep

处在非中断睡眠状态的进程数。意味着进程被阻塞。主要是指被资源阻塞的进程对列数(比如IO资源、页面调度等),当这个值较大时,需要根据应用程序来进行分析,比如数据库产品,中间件应用等。

Memory

swpd

the amount of virtual memory used

已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适的方式来减少物理内存的使用。swapd不为0,并不意味物理内存吃紧,如果swapd没变化,si、so的值长期为0,这也是没有问题的

free

the amount of idle memory

空闲的物理内存的大小,free很小并不代表内存不足,这是linux的优越性,大量的buffers和cache也属于可用内存的一部分。

buff

the amount of memory used as buffers

用来做buffer(缓存,主要用于块设备缓存)的内存数,

单位:KB

cache

the amount of memory used as cache

用来做cache(缓存,主要用于缓存文件)的内存,

单位:KB

inact

the amount of inactive memory.
(要用vmstat -a)

inactive memory的总量(长时间未访问过的页面放进inactive list,该值大表明在必要时可以回收的页面很多)

active

the amount of active memory.
(要用vmstat -a)

active memroy的总量(刚访问过的页面放进active list,无法马上回收,只能通过与文件或交换区进行页交换)

Swap

si

Amount of memory swapped in from disk (/s)

从磁盘交换到内存的交换页数量,单位:KB/秒。

so

Amount of memory swapped to disk (/s)

从内存交换到磁盘的交换页数量,单位:KB/秒

内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。当看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会 出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了, 页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。

IO

bi

Blocks received from a block device (blocks/s)

每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。

bo

Blocks sent to a block device (blocks/s)

每秒发送到块设备的块数,单位:块/秒 也就是写块设备。

System

in

The number of interrupts per second, including the clock

每秒的中断数,包括时钟中断。与cs一般同步增长。in和cs两值越大,会看到由内核消耗的CPU时间(sy)也会越大。

cs

The number of context switches per second

每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的cpu资源,这个数值应该越小越好,如果太大了,要考虑调低线程或者进程的数目,例如apache和nginx这种web服务进程。

CPU These are percentages of total CPU time.

us

Time spent running non-kernel code.(user time, including nice time)

用户CPU时间(非内核进程占用时间)(单位为百分比)。 us的值比较高时,说明用户进程消耗的CPU时间多。

sy

Time spent running kernel code. (system time)

系统使用的CPU时间(单位为百分比)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

id

Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.

空闲的CPU的时间(百分比),在Linux 2.5.41之前,这部分包含IO等待时间。

wa

Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.

等待IO的CPU时间,在Linux 2.5.41之前,这个值为0 .这个指标意味着CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

st

Time stolen from a virtual machine

针对虚拟技术,如果st不为0,说明本来分配给本机的CPU时间被其他虚拟机偷走了。

Vmstat是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析,所以我们再引入另一个工具dstat。dstat是一个可以取代vmstat、iostat、netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些功能和监控项,也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。

特性:

结合了vmstat,iostat,ifstat,netstat以及更多的信息
实时显示统计情况
在分析和排障时可以通过启用监控项并排序
模块化设计
使用python编写的,更方便扩展现有的工作任务
容易扩展和添加你的计数器(请为此做出贡献)
包含的许多扩展插件充分说明了增加新的监控项目是很方便的
可以分组统计块设备/网络设备,并给出总数
可以显示每台设备的当前状态
极准确的时间精度,即便是系统负荷较高也不会延迟显示
显示准确地单位和和限制转换误差范围
用不同的颜色显示不同的单位
显示中间结果延时小于1秒
支持输出CSV格式报表,并能导入到Gnumeric和Excel以生成图形

安装方法:
Ubuntu/Mint和Debin系统:
# sudo apt-get install dstat
RHEL/Centos和Fedora系统:
# yum install dstat
ArchLinux系统:
# pacman -S dstat

使用方法:
dstat的基本用法就是输入dstat命令,输出如下:

这是默认输出显示的信息:
CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到”wait”一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在”waits”时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。

磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。

网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。

分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。

系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。你的服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。

默认情况下,dstat每秒都会刷新数据。如果想退出dstat,你可以按”CTRL-C”键。

需要注意的是报告的第一行,通常这里所有的统计都不显示数值的。这是由于dstat会通过上一次的报告来给出一个总结,所以第一次运行时是没有平均值和总值的相关数据。

但是dstat可以通过传递2个参数运行来控制报告间隔和报告数量。例如,如果你想要dstat输出默认监控、报表输出的时间间隔为3秒钟,并且报表中输出10个结果,你可以运行如下命令:

dstat 3 10

在dstat命令中有很多参数可选,你可以通过man dstat命令查看,大多数常用的参数有这些:

-l :显示负载统计量
-m :显示内存使用率(包括used,buffer,cache,free值)
-r :显示I/O统计
-s :显示交换分区使用情况
-t :将当前时间显示在第一行
–fs :显示文件系统统计数据(包括文件总数量和inodes值)
–nocolor :不显示颜色(有时候有用)
–socket :显示网络统计数据
–tcp :显示常用的TCP统计
–udp :显示监听的UDP接口及其当前用量的一些动态数据

当然不止这些用法,dstat附带了一些插件很大程度地扩展了它的功能。你可以通过查看/usr/share/dstat目录来查看它们的一些使用方法,常用的有这些:

-–disk-util :显示某一时间磁盘的忙碌状况
-–freespace :显示当前磁盘空间使用率
-–proc-count :显示正在运行的程序数量
-–top-bio :指出块I/O最大的进程
-–top-cpu :图形化显示CPU占用最大的进程
-–top-io :显示正常I/O最大的进程
-–top-mem :显示占用最多内存的进程

举一个我常用的例子,显示哪些进程在占用IO、内存、CPU:

#dstat -l -m -r -c --top-io --top-mem --top-cpu

如何输出一个csv文件
想输出一个csv格式的文件用于以后,可以通过下面的命令:

# dstat –output /tmp/sampleoutput.csv -cdn
————————————————
原文链接:https://blog.csdn.net/smooth00/article/details/78623728

中间证书

前言

我们经常在安装和部署SSL证书的时候,需要一同安装中间证书。中间证书到底是什么?为什么必须要安装?为什么有时候,没有中间证书,我的IE也能正常访问HTTPS?为什么其他浏览器都OK了,但安卓手机就是不行了!

中间证书是什么

中间证书,其实也叫中间CA(中间证书颁发机构,Intermediate certificate authority, Intermedia CA),对应的是根证书颁发机构(Root certificate authority ,Root CA)。为了验证证书是否可信,必须确保证书的颁发机构在设备的可信CA中。如果证书不是由可信CA签发,则会检查颁发这个CA证书的上层CA证书是否是可信CA,客户端将重复这个步骤,直到证明找到了可信CA(将允许建立可信连接)或者证明没有可信CA(将提示错误)。

为了构建信任链,每个证书都包括字段:“使用者”和“颁发者”。 中间CA将在这两个字段中显示不同的信息,显示设备如何获得下一个CA证书,重复检查是否是可信CA。

根证书,必然是一个自签名的证书,“使用者”和“颁发者”都是相同的,所以不会进一步向下检查,如果根CA不是可信CA,则将不允许建立可信连接,并提示错误。

例如:一个服务器证书 domain.com,是由Intermedia CA签发,而Intermedia CA的颁发者Root CA在WEB浏览器可信CA列表中,则证书的信任链如下:

证书 1 – 使用者:domain.com;颁发者:Intermedia CA

证书 2 – 使用者:Intermedia CA;颁发者: Root CA

证书 3 – 使用者:Root CA ; 办法和: Root CA

当Web浏览器验证到证书3:Root CA时,发现是一个可信CA,则完成验证,允许建立可信连接。当然有些情况下,Intermedia CA也在可信CA列表中,这个时候,就可以直接完成验证,建立可信连接。

为何需要中间证书

  • 保护根证书。如果直接采用根证书签发证书,一旦发生根证书泄露,将造成极大的安全问题。所以目前根证书都要求离线保存,如果需要用根证书签名,则必须通过人手工方式,直接用根证书在线签发证书是不允许的。
  • 区分不同类型的产品。针对DV,OV,EV等不同类型,不同安全级别的证书,CA会采用不同的根证书,一来便于区分,二来一旦出现问题,也便于区别处理,降低影响。中间CA证书一般都是支持在线签发证书的。
  • 交叉验证。为了获得更好的兼容性,支持一些很古老的浏览器,有些根证书本身,也会被另外一个很古老的根证书签名,这样根据浏览器的版本,可能会看到三层或者是四层的证书链结构,如果能看到四层的证书链结构,则说明浏览器的版本很老,只能通过最早的根证书来识别。

要获得中间证书,一般有两种方式:第一种、由客户端自动下载中间证书;第二种、由服务器推送中间证书。以下分别讨论。

客户端自动下载中间证书

一张标准的证书,都会包含自己的颁发者名称,以及颁发者机构访问信息: Authority Info Access,其中就会有颁发者CA证书的下载地址。

 authority info access

通过这个URL,我们可以获得这个证书的颁发者证书,即中间证书。Windows、IOS、MAC都支持这种证书获取方式,但Android不支持这种方式,所以,如果我们仅依靠这种方式来获得中间证书,就无法在Android系统上建立可信连接。

除了操作系统支持外,还有一个很重要的因素,就是客户端可以正常访问公网。如果客户端本身在一个封闭的网络环境内,无法访问公网下载中间证书,就会造成失败,无法建立可信连接。

此外,有些CA的中间证书下载地址因为种种原因被“墙”掉了,也会造成我们无法获得中间证书,进而无法建立可信链接。

虽然自动下载中间证书的机制如此不靠谱,但在有些应用中,这却是唯一有效的机制,譬如邮件签名证书,由于我们发送邮件时,无法携带颁发邮件证书的中间证书,往往只能依靠客户端自己去下载中间证书,一旦这个中间证书的URL无法访问(被“墙”掉)就会造成验证失败。

 服务器推送中间证书

服务器推送中间证书,就是将中间证书,预先部署在服务器上,服务器在发送证书的同时,将中间证书一起发给客户端。我们部署证书,首先就要找到颁发服务器证书的中间证书,可以用中间证书下载工具

如果我们在服务器上不主动推送中间证书,可能会造成的问题

  • Android手机无法自动下载中间证书,造成验证出错,提示证书不可信,无法建立可信连接。
  • Java客户端无法自动下载中间证书,验证出错,可信连接失败。
  • 内网电脑,在禁止公网的情况下,无法自动下载中间证书,验证出错,可信连接失败。

虽然我们不部署中间证书,在大多数情况,我们依然可以建立可信的HTTPS连接,但为了避免以上这些情况,我们必须在服务器上部署中间证书。

所以,为了确保我们在各种环境下都能建立可信的HTTPS连接,我们应该尽量做到以下几点:

1、必须在服务器上部署正确的中间证书,以确保各类浏览器都能获得完整的证书链,完成验证。

2、选择可靠的SSL服务商,有些小的CA机构,因为各种原因,造成他们的中间证书下载URL被禁止访问,即使我们在服务器上部署了中间证书,但也可能存在某种不可测的风险,这是我们应该尽力避免的。

3、中间证书往往定期会更新,所以在证书续费或者重新签发后,需要检查是否更换过中间证书。

linux 安装php swoole 扩展

方案一

swoole目前已经加入php的官方扩展库

即是说它已经是PHP的一枚扩展了

所以我们这里可以使用一种更便捷的安装方式

pecl install swoole

不过这种方式需要本机的phpize支持

这里我没有使用这种方式,具体的问题跟流程就不说了

总之它需要你前置phpize支持

这种方式安装结束后需要在php.ini文件中添加扩展

extension=swoole.so

方案二

首先我们需要下载swoole到我们本地

这里我偷懒直接下到本地在传到服务器上了

在linux下cd到目标目录里

 ./configure --with-php-config=/usr/bin/php-config
 //这里(/usr/bin/php-config)是你的php-config文件的路径
 

sudo make

sudo make install

这一步如果没有报错的话就安装成功了(仿佛说了句废话)

安装好后我们来测试一下是否安装成功

php -m

如果能看到swoole就表示安装成功了

—————————————分割线————————————

怎样让swoole在后台运行呢?采用xshell等工具远程连接服务器的小伙伴发现就算在命令后面加上“&”符号,退出远程连接终端后,依然就连不上了。

这个问题很好解决,只要加上“nohup” 命令就行了:
nohup /usr/local/php/bin/php  swoole.php >> log_dir.log 2>&1 &

好了就先到这吧- –

php.ini文件神秘失踪

win_10 系统下wampserver中的php.ini文件神秘失踪,没有发现文件失踪的原因,在此留个记录。

我的系统是win_10系统,安装的是wampserver_3.1.3 ,32位的版本,今天早上启动系统后,开启wampserver,然后运行本地的开发项目,发现报错。错误信息大致的意思是说没有发现:Phalcon\Config\Adapter\Php  这个类。

这个是phalcon框架用来载入配置文件的啊,怎么会找不到这个类呢,近两天没有更新相关的东西,找不到类肯定是phalcon载入出问题了。

phpinfo(),查看信息发现phalcon模块不在了,查看ext文件夹下,phalcon.dll扩展还在,再看信息中,显示php.ini文件不存在。进入wampserver目录中php.ini文件的目录,发现php.ini文件确实不见了。我很确认最近相关的东西都没动过,并且昨天直到下班,我的wampserver还是可以正常运行的。

将原始的php.ini文件拷贝一份到配置目录,重新写入extension=phalcon;后问题解决。

问题解决了,疑惑没有解决,考虑到系统自行删除php.ini文件的可能性应该没有,想到是不是杀毒软件隔离了,查看也不是。全盘杀毒也没有发现病毒,再说,有什么病毒会专门针对wampserver的php.ini文件?

最终没有发现php.ini文件消失的原因,在此留个记录。

执行 rm -rf /bin 命令后

不小心删除了/bin目录,对于我们这种对系统认识不太高的人来说,的确是受到了灾难性的打击,但是静下心来好好搜索分析,还是能找到解决办法的,跨过了一个坎,就是一次成长,亲们,发现php的强大了吗^_^!

由于服务器被挖矿程序黑了,cpu占到100%,在删除相关问题文件的时候,不小心执行了 rm -rf /bin 命令,然后再删除另一个恶意文件时,发现rm命令不能用了,查询一下,发现ls和vi这些个基本命令全都不可用了,这下发现自己闯大祸了。线上服务器出问题从来没有小问题。

什么都不敢动了,赶紧网上查解决办法,网上大体上是给出了两个方案:一个是去机房使用系统光盘恢复bin目录;一个是从相同系统中拷贝bin目录下的文件到当前目录。简单了解了下,如果删除后取消了远程连接,也没办法再登录了,就只能用第一个方法了。还好,我保留着连接没有断,另外有一个相同系统的正常的服务器的bin目录可供使用,所以决定用第二个方案。

然而,问题又来了,bin被删除后,基本上系统什么命令都没办法执行了,cp,scp等等所有能用的命令都不可用了。。。

正在陷入极度恐慌之时,搜索到一篇文章,给了我一个思路,文章地址:http://www.cnblogs.com/hark0623/p/5886091.html,就是将文件放到web服务器上,然后通过wget将文件拉倒当前服务器来。接下来将被删除bin目录的服务器称为A,同系统正常服务器称为B;

按照这个思路,我将B服务器上的bin目录copy了一份到B服务器的web目录,浏览器测试可以将文件下载下来,接下来考虑怎样在A服务器上获取文件。原本文章里面说的使用wget的功能,经测试发现命令不可用,就是说wget也是在bin目录里的命令。那就再换思路,除了bin目录里的命令,还有哪些是可以远程获取文件内容的。

由于A、B两台服务器用的都是php,我就考虑,能不能用php的函数实现从B服务器上复制文件到A服务器上来的可能性。

php执行脚本的路子已经很熟悉了,但是当前情况是,A服务器上已经没办法进行vi等类似的编辑操作,也没法进行git等版本控制器的操作了,那么php有没有类似的命令行操作呢?然后继续网上搜索信息,发现php是可以直接执行php脚本的,参考文章地址:http://www.linuxdiyf.com/linux/13076.html,文章里提供了一个方法:

/usr/local/php/bin/php -r 'phpinfo();'

经过测试,使用下面的命令:

/usr/local/php/bin/php -r '$content=file_get_contents("http://abc.def.com/testbin/ls");file_put_contents("ls",$content);'

顺利的将B服务器上的文件拷贝到了A服务器上来,测试是否可用

./ls

提示权限不足,跟这篇文章给的结果一样:http://www.cnblogs.com/hark0623/p/5886091.html,采用文章里的方法:perl -e “chmod 0777, ‘mkdir'”,perl命令依然不能用,那就继续php解决:

/usr/local/php/bin/php -r 'chmod("ls",0777);'

再次测试 ./ls 发现可用了,按照这个思路,重点拿到了cp和rz文件,通过cp将rz文件copy到 /bin 目录下,然后将剩下的文件全部通过rz上传到A服务器的/bin目录,chmod修改权限后,基本命令都恢复可用了,远程登录也OK了,至此问题解决

诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别

诡异的 df -h 磁盘空间100%报警分析,如果没有大文件,很可能是后台部分程序造成,停掉程序就好了,如果磁盘空间是100%,很多操作会受到影响,包括添加用户,修改用户密码,修改crontab,vi编辑文件等

前言:
早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo “” > show_web-error.log或者> show_web-debug.log清空语句,然后rm -rf 掉一些tar.gz包,空出来30G空间。而且也关闭了tomcat的debug信息。刚刚又接到报警,磁盘100%了。怎么回事?

1,进去df -h下,确实100%了,如下所示:
[root@localhost ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
113G  113G     0 100% /
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 8.8G     0  8.8G   0% /dev/shm
确实已经100%了,再去/去检查

2,去/根目录check,du -sh *
[root@localhost ~]# cd /
[root@localhost /]# du -sh *
7.8M bin
6.9M boot
131M data
196K dev
111M etc
178M home
131M lib
23M lib64
119M logs
16K lost+found
8.0K media
0 misc
8.0K mnt
0 net
0 nohup.out
3.8G opt
15M pcre-8.33
2.1M pcre-8.33.zip
du: 无法访问 “proc/11575/task/11575/fd/1565”: 没有那个文件或目录
du: 无法访问 “proc/15403/task/14464/fd/625”: 没有那个文件或目录
0 proc
1.4G product
153M repo
143M root
37M sbin
8.0K selinux
363M soft
8.0K srv
0 sys
20K temp
100K tftpboot
2.1G tmp
8.6G usr
184M var
30M varnish-3.0.3
56M zabbix-2.0.8
[root@localhost /]#
看到,占据的磁盘空间所有的加起来也不到30G,可是df -h下来,确实100%呢?差异在哪里?

3,baidu,google资料,找到 http://www.chinaunix.net/old_jh/6/465673.html 里面有这么2段话:
(1):
When you open a file, you get a pointer.  Subsequent writes to this file
references this file pointer.  The write call does not check to see if the file
is there or not.  It just writes to the specified number of characters starting
at a predetermined location.  Regardless of whether the file exist or not, disk
blocks are used by the write operation.

The df command reports the number of disk blocks used while du goes through the
file structure and and reports the number of blocks used by each directory.  As
far as du is concerned, the file used by the process does not exist, so it does
not report blocks used by this phantom file.  But df keeps track of disk blocks
used, and it reports the blocks used by this phantom file.
以及leolein朋友的回复:
谢谢,就是这个原因。
我因为磁盘快满了就删除了一些过期的文件,可能应用程序还在使用这些文件句柄,所以导致了我说的问题。
我把所有的应用程序都停止后,du和df的结果就大致相同了

(2):
This section gives the technical explanation of why du and df sometimes report
different totals of disk space usage.

When a program that is running in the background writes to a file while the
process is running, the file to which this process is writing is deleted.
Running df and du shows a discrepancy in the amount of disk space usage.  The
df command shows a higher value.

如果文件已经删除了,但是还有残留的进程引用它(具体不知道怎么表达好),则df看到的空间使用量并没有减去那些已经删除的文件。而创建并写入一个文件是,判断空间是否足够是依据df(本人认为),所以df 100%的时候就不能写入文件了。–但是创建文件是可以的,我做过测试。查看这些残留进程(姑且这么称呼,我也不知道那些进程叫什么)的方法是lsof
# lsof /home | grep /home/oracle/osinfo | sort +8 | grep ‘^.*070920.*$’
sadc    17821   root    3w   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
sadc    17861   root    3u   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
sadc    17981   root    3u   REG  253,1 326492112 926724 /home/oracle/osinfo/070920sar.data (deleted)
top     17858   root    1w   REG  253,1 169919916 927111 /home/oracle/osinfo/070920top.data (deleted)
top     17977   root    1w   REG  253,1 169919916 927111 /home/oracle/osinfo/070920top.data (deleted)
注意后面的deleted
然后把这些进程都kill掉就可以释放空间了。

我想起了,我早晨在执行echo “” >shop_web.log类似操作的时候,并没有停止tomcat应用,所以应用是一直往log里面写数据的,那么我>的那一刻,是du -sh *可能看到磁盘空间有了,df -h也可以看到磁盘释放了,但是当tomcat应用继续往shop_web.log里面写日志的时候,加载的还是最初打开的那个执行>shop_web.log之前的占据很大磁盘空间的缓存文件。所以磁盘其实一直没有释放掉,而能坚持一天不报警,是由于我rm了一些tar.gz包所释放的空间。

4,重启tomcat和nginx应用
所以,我应该重启tomcat和nginx,应用不再加载旧的缓存文件,执行重启tomcat命令,由于tomcat应用比较多,所以写了一个脚本来执行
[root@localhost local]# cat /root/start_tomcat_port.sh
#!/bin/bash
PID=`ps -eaf|grep apache-tomcat-6.0.37_$1 |grep -v grep |grep -v start_tomcat_port |awk ‘{print $2}’`
echo $1
echo $PID
kill -9 $PID
rm -rf /var/tomcat/$1.pid
/usr/local/apache-tomcat-6.0.37_$1/bin/startup.sh
[root@localhost local]#
执行重启tomcat:
sh /root/start_tomcat_port.sh 6100;
sh /root/start_tomcat_port.sh 6200;
sh /root/start_tomcat_port.sh 6300;
sh /root/start_tomcat_port.sh 6400;
sh /root/start_tomcat_port.sh 6500;
sh /root/start_tomcat_port.sh 6700;
sh /root/start_tomcat_port.sh 7100;
sh /root/start_tomcat_port.sh 7200;
sh /root/start_tomcat_port.sh 7300;
执行重启nginx:
service nginx restart

5,再去check下磁盘空间
[root@localhost local]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
113G   18G   90G  17% /
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 8.8G     0  8.8G   0% /dev/shm
[root@localhost local]#

看到df -h命令正常了,已经释放了90G的磁盘空间,现在磁盘使用率才17%,nagios报警解除了。

6,汇总一些原理分析
实现原理:
du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
du是用户级程序,不考虑Meta Data(系统为自身分配的一些磁盘块)

ps:应用程序打开的文件句柄没有关闭的话,会造成df命令显示的剩余磁盘空间少。而du则不会。
例子:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
if(open(“tempfile”,O_RDWR) < 0){
fprintf(stderr,”open error”);
exit(-1);
}

if(unlink(“tempfile”) < 0){
fprintf(stderr,”unlink error”);
exit(-1);
}

printf(“file unlinked\n”);
sleep(15);
printf(“done\n”);
exit(0);
}

文章来源:http://blog.csdn.net/mchdba/article/details/38305081

linux时间同步矫正

线上服务器,总是会发现时间与网络事件不同步的现象,现在教大家一个服务器自动同步时间的方法!

1,yum自动选择安装ntp,然后设置时区为北京,并更新服务器时间

// yum安装ntp

>yum -y install ntp

// 删除本地时间文件

>rm -f /etc/localtime

// 重新生成本地时间文件

>ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

// 去pool.ntp.org同步最新时间

>/usr/sbin/ntpdate -u pool.ntp.org

2,crontab 添加自动同步时间的任务

// 编辑linux自动任务

>crontab -e

## 设定每6小时同步一次

**/6 * * *  /usr/sbin/ntpdate-u pool.ntp.org >/dev/null2>&1

// 重启crond服务

>systemctl restart crond
“//”和“##” 均为注释符,后跟注释说明程序员开心一刻:
美国圣昆廷州立监狱安排囚犯学习编程,完成学习的犯人出狱后,没有一个人重新犯罪被抓回监狱。一位刚刚出狱的囚犯说:“太可怕了,我宁愿在外面饿死也不想再进去学编程了。”

使用Let’s Encrypt手动创建https证书

 Let’s Encrypt是一个开源免费的SSL证书项目,是由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起的,现由Linux基金会托管。

这篇文章讲述用letsencrypt在Linux centos7上生成ssl证书的操作流程。

1、安装letsencrypt,不知道git是什么的,自行阅读课外书,安装等待时间有点漫长。。。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

2、生成私钥

openssl genrsa 4096 > 2pea.com.key

3、生成CSR(Certificate Signing Reqeust),后面要通过该文件,向 Let’s Encrypt 请求证书

openssl req -new -sha256 -key 2pea.com.key  -out 2pea.com.csr
回车后,让输入国家(中国用 CN )省(BeiJing)市(BeiJing),公司,部门 ,域名 等,域名为要进做https的域名比如博主用的是www.2pea.com,域名必须填写,其他可为空

4、向letsencrypt服务器发起获取证书的请求

./letsencrypt-auto certonly --authenticator manual --server https://acme-v01.api.letsencrypt.org/directory --text --email admin@2pea.com --csr 2pea.com.csr

输入完Y,在出现”Press ENTER to continue“时,不要动,进行下面第五步操作。(ssh远程登录,重新打开一个新窗口进行操作)

5、验证证书对应域名的所有权
官方给出了两种方法,本文只给出这一种方法。根据以下提供的提示信息,需要认证者在服务器上实现以下功能(下文中“*****”部分每次执行不一样),外网采用curl 请求该地址:http://www.2pea.com/.well-known/acme-challenge/*****1,要能够获得*****2的输出内容。

Make sure your web server displays the following content at
http://www.2pea.com/.well-known/acme-challenge/*****1 before continuing:

*****2

6、curl上文给出的地址,返回的结果确认和*****2一样,则回到第4步的操作窗口按回车键,证书创建成功,执行ls查看命令,发现返回3个pem文件其中:

0000_cert.pem 文件就是证书文件

7、nginx进行一下改进:

server
{
listen 80;
server_name www.2pea.com;
rewrite ^(.*)$ https://$host$1 permanent; // 将所有请求指向https
}

server
{
listen 443;
#listen 80;
server_name www.2pea.com;

ssl on;
ssl_certificate /dir/0000_cert.pem;
ssl_certificate_key /dir/2pea.com.key;
ssl_session_timeout 10m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC$+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

}

秘钥和证书地址自己定义

Let’s Encrypt有效期只有3个月,作为懒人,肯定不会每间隔三个月上服务器上重新生成一遍证书的,还好Let’s Encrypt提供了自动更新证书的功能:

/root/letsencrypt/letsencrypt-auto renew

将该命令写入脚本然后添加自动任务,以后就不需要手动更新了。需要注意的是,执行该命令前需要关闭nginx,所以脚本内容可参考一下代码

service nginx stop
/root/letsencrypt/letsencrypt-auto renew
service nginx start

主要参考文章地址:http://www.cnblogs.com/dudu/p/letsencrypt-manual-https-cert.htmlhttp://www.jb51.net/article/70640.htm

搭建本地https测试环境

找到的最简单的搭建https的文章,面向lnmp

生成证书 1. 使用 openssl 生成密钥 privkey.pem:

openssl genrsa -out privkey.pem 1024/2038

2. 使用密钥生成证书 server.pem:

openssl req -new -x509 -key privkey.pem -out server.pem -days 365

证书信息可以随便填或者留空,只有 Common Name 要根据你的域名填写。

以我的个人网站为例

Common Name (e.g. server FQDN or YOUR name) []: wuyanxin.com

也可以通过*.yourdomain.com来匹配你的二级域名

配置nginx server { listen 443; server_name youdomain.com; ssl on; ssl_certificate /path/to/server.pem; ssl_certificate_key /path/to/privkey.pem; …}

验证配置,重启nginx

$ sudo nginx -t && sudo nginx -s reload 信任证书

这时访问你的站点会得到一个不安全提示,因为你的证书不是一个有效的证书颁发机构颁发的。

这时需要我们手动信任证书。

1 点击地址栏前面的红色感叹号,再点击“详细信息”

2 点击“View certification”

3 将上图中的证书拖拽到桌面,会在桌面生成一个“wuyanxin.com.cer”文件

4 双击打开,并输入密码

5 在列表中找到你的证书,双击打开

6 将证书改为“始终信任”,然后关闭窗口,输入密码

7 刷新页面,你将获得一个绿色小锁(valid HTTPS)

原地址:http://mt.sohu.com/20170106/n478007802.shtml

<转>apache搭建本地https

apache搭建本地https

转自简书  http://www.jianshu.com/p/aa7f009a5364

直接开始吧!https、openssl、apache相关的东西,不知道的自行百度吧。
第一步修改apache的配置文件:
  • 修改httpd.conf文件
    目录:/etc/apache2/httpd.conf
    修改参数:
    1.LoadModule ssl_module libexec/apache2/mod_ssl.so
    2.Include /etc/apache2/extra/httpd-ssl.conf
    3.Include /etc/apache2/extra/httpd-vhosts.conf
    修改方式:将上述三条前的#去掉开启
  • 修改httpd-ssl.conf文件
    目录:/etc/apache2/extra/httpd-ssl.conf
    1.SSLCertificateFile “/etc/apache2/ssl/server.crt”
    2.SSLCertificateKeyFile “/etc/apache2/ssl/server.key”
    3.SSLCertificateChainFile “/private/etc/apache2/server-ca.crt”
    修改方式:将上述三条前的#去掉开启
  • 编辑httpd-vhosts.conf文件

    屏幕快照 2016-08-30 下午4.21.14.png
相关属性和路径的解释:
httpd.conf:

LoadModule ssl_module libexec/apache2/mod_ssl.so(告诉apache支持ssl)
Include /etc/apache2/extra/httpd-ssl.conf(ssl配置文件)
Include /etc/apache2/extra/httpd-vhosts.conf(虚拟主机配置文件)

httpd-ssl.conf:

SSLCertificateFile “/etc/apache2/ssl/server.crt”(服务端证书的目录)
SSLCertificateKeyFile “/etc/apache2/ssl/server.key”(服务端私钥的目录)
SSLCertificateChainFile “/private/etc/apache2/server-ca.crt”(钥匙链的目录)

httpd-vhosts.conf:

DocumentRoot(默认访问的文件夹路径)
ServerName(域名)
SSLEngine on(打开ssl引擎)
SSLCipherSuite(支持的加密算法)

第二步修改openssl.cnf文件:

目录:/usr/local/etc/openssl/openssl.cnf
1.[ CA_default ]部分dir目录(修改成自己想修改的任何一个目录或者不修改)
2.(前提需要添加别名等扩展信息,别名为例)[ v3_ca ]部分subjectAltName打开(设置为@alt_names[名字随意])
3.(前提需要添加别名等扩展信息,别名为例)[ usr_cert ]部分subjectAltName打开(设置为@alt_names[名字随意])
4.添加[ alt_names ]
IP.1 = 192.168.2.20
5.其他信息根据实际需求更改

第三步生成证书文件:

这里所有的操作都在[ CA_default ]部分dir目录下进行。

准备工作:

1.touch index.txt
2.touch index.txt.attr
3.echo 01 > serial
4.mkdir newcerts
5.mkdir keys

生成根证书:

私钥:openssl genrsa -des3 -out keys/rootca.key 2048
根证书:openssl req -new -x509 -days 3650 -key keys/rootca.key -out keys/rootca.crt

生成二级根证书:

私钥:openssl genrsa -des3 -out keys/secondca.key 2048
去密码:openssl rsa -in keys/secondca.key -out keys/secondCA.key
请求文件:openssl req -new -days 3650 -key keys/secondca.key -out keys/secondca.csr
根证书签名:openssl ca -extensions v3_ca -in keys/secondca.csr -config /usr/local/etc/openssl/openssl.cnf -days 3650 -out keys/secondca.crt -cert keys/rootca.crt -keyfile keys/rootca.key

生成服务端证书:

私钥:openssl genrsa -des3 -out keys/server.key 2048
去密码:openssl rsa -in keys/server.key -out keys/server.key
请求文件:openssl req -new -days 3650 -key keys/server.key -out keys/server.csr
签名:openssl ca -in keys/server.csr -config /usr/local/etc/openssl/openssl.cnf -days 3650 -out keys/server.crt -cert keys/secondca.crt -keyfile keys/secondca.key

生成钥匙链:

钥匙链:cat keys/rootca.crt keys/secondca.crt > chain.crt

第四步生成证书时需要注意的问题

1.countryName、stateOrProvinceName、organizationName生成证书的时候必须保持一致。
2.如果签名的时候发生错误修改openssl.cnf文件下的default_md属性为sha256(sha256为通用的签名算法)
3.Common Name尽量保持不一致,服务端证书生成的时候Common Name为域名
4.如果遇到其他的问题可以留言

第五步将生成的文件对应到配置文件的目录下启动apache

启动apache:sudo apachectl restart
在浏览器中访问:

屏幕快照 2016-08-30 下午5.16.07.png

继续:

屏幕快照 2016-08-30 下午5.21.36.png
第六步客户端的验证(只说AFNetworking)

提示:如果没有使用afn需遵循NSURLSessionTaskDelegate代理,在代理方法里验证即可。
1.在钥匙串中导出根证书的cer文件导入工程
2.关键代码:

AFSecurityPolicy securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;

3.验证结果

结束语

在这里浪费了一些时间,很多原因是因为网上有些博客写的不是很明了或者已经很老了,因此走了一些弯路。所以写出来这篇博客介绍的不算很详尽,但是关键的点都已经写了出来。希望能够帮助到你们。