Skip to content Skip to main navigation Skip to footer

Linux

Linux:对 Linux 新手有用的 20 个命令

你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现在我的世界里了。从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳。我担心该记住多少命令,来帮助我完成所有任务。毫无疑问,在线文档,书籍,man pages以及社区帮了我一个大忙,但是我还是坚信有那么一篇文章记录了如何简单学习和理解命令的秘籍。这激发了我掌握Linux和使它容易使用的积极性。本文就是通往那里的阶梯。

1. ls命令

ls命令是列出目录内容(List Directory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹。

“ls -l”命令以详情模式(long listing fashion)列出文件夹的内容。

“ls -a”命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件。

注意:在Linux中,文件以“.”开头的就是隐藏文件,并且每个文件,文件夹,设备或者命令都是以文件对待。ls -l 命令输出:

  1. d (代表了是目录).
  2. rwxr-xr-x 是文件或者目录对所属用户,同一组用户和其它用户的权限。
  3. 上面例子中第一个ravisaive 代表了文件文件属于用户ravisaive
  4. 上面例子中的第二个ravisaive代表了文件文件属于用户组ravisaive
  5. 4096 代表了文件大小为4096字节.
  6. May 8 01:06 代表了文件最后一次修改的日期和时间.
  7. 最后面的就是文件/文件夹的名字

更多”ls“例子请查看 15 linux中ls命令实例

2. lsblk命令

lsblk“就是列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。

lsblk -l”命令以列表格式显示块设备(而不是树状格式)。

注意:lsblk是最有用和最简单的方式来了解新插入的USB设备的名字,特别是当你在终端上处理磁盘/块设备时。

3. md5sum命令

md5sum”就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。

注意:用户可以使用官方提供的和md5sum生成签名信息匹对以此检测文件是否改变。Md5sum没有sha1sum安全,这点我们稍后讨论。

4. dd命令

dd”命令代表了转换和复制文件。可以用来转换和复制文件,大多数时间是用来复制iso文件(或任何其它文件)到一个usb设备(或任何其它地方)中去,所以可以用来制作USB启动器。

注意:在上面的例子中,usb设备就是sdb1(你应该使用lsblk命令验证它,否则你会重写你的磁盘或者系统),请慎重使用磁盘的名,切忌。

dd 命令在执行中会根据文件的大小和类型 以及 usb设备的读写速度,消耗几秒到几分钟不等。

5. uname命令

uname“命令就是Unix Name的简写。显示机器名,操作系统和内核的详细信息。

注意: uname显示内核类别, uname -a显示详细信息。上面的输出详细说明了uname -a

  1. Linux“: 机器的内核名
  2. tecmint“: 机器的节点名
  3. 3.8.0-19-generic“: 内核发布版本
  4. #30-Ubuntu SMP“: 内核版本
  5. i686“: 处理器架构
  6. GNU/Linux“: 操作系统名

6. history命令

history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。

Linux:对 Linux 新手有用的 20 个命令
Linux:对 Linux 新手有用的 20 个命令

注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以在你写命令时自动补全。

7. sudo命令

sudo”(super user do)命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

注意:sudo 允许用户借用超级用户的权限,然而”su“命令实际上是允许用户以超级用户登录。所以sudosu更安全。并不建议使用sudo或者su来处理日常用途,因为它可能导致严重的错误如果你意外的做错了事,这就是为什么在linux社区流行一句话:

“To err is human, but to really foul up everything, you need root password.”

 

“人非圣贤孰能无过,但是拥有root密码就真的万劫不复了。” # 译

8. mkdir命令

mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了”(“cannot create folder, folder already exists”)

注意:目录只能在用户拥有写权限的目录下才能创建。mkdir:不能创建目录`tecmint`,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住我开头所说的-在linux中,文件,文件夹,驱动,命令,脚本都视为文件)

9. touch 命令

touch”命令代表了将文件的访问和修改时间更新为当前时间。touch命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。

注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

10. chmod 命令

chmod”命令就是改变文件的模式位。chmod会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。

在文件(文件夹或者其它,为了简单起见,我们就使用文件)中存在3中类型的权限

所以如果你想给文件只读权限,就设置为’4′;只写权限,设置权限为’2′;只执行权限,设置为1; 读写权限,就是4+2 = 6, 以此类推。

现在需要设置3种用户和用户组权限。第一个是拥有者,然后是用户所在的组,最后是其它用户。

这里root的权限是 rwx(读写和执行权限),所属用户组权限是 r-x (只有读和执行权限, 没有写权限)对于其它用户权限是 –x(只有只执行权限)

为了改变它的权限,为拥有者,用户所在组和其它用户提供读,写,执行权限。

三种都只有读写权限

拥有者用户有读写和执行权限,用户所在的组和其它用户只有可执行权限

注意:对于系统管理员和用户来说,这个命令是最有用的命令之一了。在多用户环境或者服务器上,对于某个用户,如果设置了文件不可访问,那么这个命令就可以解决,如果设置了错误的权限,那么也就提供了为授权的访问。

11. chown命令

chown”命令就是改变文件拥有者和所在用户组。每个文件都属于一个用户组和一个用户。在你的目录下,使用”ls -l“,你就会看到像这样的东西。

在这里,目录Binary属于用户”server“,和用户组”root“,而目录”Desktop“属于用户“server”和用户组”server

chown”命令用来改变文件的所有权,所以仅仅用来管理和提供文件的用户和用户组授权。

注意:“chown”所给的文件改变用户和组的所有权到新的拥有者或者已经存在的用户或者用户组。

12. apt命令

Debian系列以“apt”命令为基础,“apt”代表了Advanced Package Tool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。

Linux:对 Linux 新手有用的 20 个命令
Linux:对 Linux 新手有用的 20 个命令

注意:上面的命令会导致系统整体的改变,所以需要root密码(查看提示符为”#”,而不是“$”).和yum命令相比,Apt更高级和智能。

见名知义,apt-cache用来搜索包中是否包含子包mplayerapt-get用来安装,升级所有的已安装的包到最新版。

关于apt-get 和 apt-cache命令更多信息,请查看 25 APT-GET和APT-CACHE命令

13. tar命令

tar”命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。

 
 

注意: “tar.gz“代表了使用gzip归档,“bar.bz2”使用bzip压缩的,它压缩的更好但是也更慢。

了解更多”tar 命令”的例子,请查看 18 Tar命名例子

14. cal 命令 

(附注,个人认为这个命令列入这里就是凑数的)

cal”(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份。

显示已经过去的月份,1835年2月

显示未来的月份,2145年7月。

注意: 你不需要往回调整日历50年,既不用复杂的数据计算你出生那天,也不用计算你的生日在哪天到来,[因为它的最小单位是月,而不是日]。

15. date命令

date”命令使用标准的输出打印当前的日期和时间,也可以深入设置。

 

注意:这个命令在脚本中十分有用,以及基于时间和日期的脚本更完美。而且在终端中改变日期和时间,让你更专业!!!(当然你需要root权限才能操作这个,因为它是系统整体改变)

16. cat命令

cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容。

 

注意:“>>”和“>”调用了追加符号。它们用来追加到文件里,而不是显示在标准输出上。“>”符号会删除已存在的文件,然后创建一个新的文件。所以因为安全的原因,建议使用“>>”,它会写入到文件中,而不是覆盖或者删除。

在深入探究之前,我必须让你知道通配符(你应该知道通配符,它出现在大多数电视选秀中)。通配符是shell的特色,和任何GUI文件管理器相比,它使命令行更强大有力!如你所看到那样,在一个图形文件管理器中,你想选择一大组文件,你通常不得不使用你的鼠标来选择它们。这可能觉得很简单,但是事实上,这种情形很让人沮丧!

例如,假如你有一个有很多很多各种类型的文件和子目录的目录,然后你决定移动所有文件名中包含“Linux”字样的HTML文件到另外一个目录。如何简单的完成这个?如果目录中包含了大量的不同名的HTML文件,你的任务很巨大,而不是简单了。

在LInux CLI中,这个任务就很简单,就好像只移动一个HTML文件,因为有shell的通配符,才会如此简单。这些是特殊的字符,允许你选择匹配某种字符模式的文件名。它帮助你来选择,即使是大量文件名中只有几个字符,而且在大多数情形中,它比使用鼠标选择文件更简单。

这里就是常用通配符列表:

! 叫做非,带’!’的反向字符串为真

更多请阅读Linux cat 命令的实例 13 Linux中cat命令实例

17. cp 命令

“copy”就是复制。它会从一个地方复制一个文件到另外一个地方。

 

注意: cp,在shell脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。

18. mv 命令

mv”命令将一个地方的文件移动到另外一个地方去。

注意:mv 命令可以使用通配符。mv需谨慎使用,因为移动系统的或者未授权的文件不但会导致安全性问题,而且可能系统崩溃。

19. pwd 命令

pwd”(print working directory),在终端中显示当前工作目录的全路径。

注意: 这个命令并不会在脚本中经常使用,但是对于新手,当从连接到nux很久后在终端中迷失了路径,这绝对是救命稻草。

20. cd 命令

最后,经常使用的“cd”命令代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作。

 

注意: 在终端中切换目录时,cd就大显身手了。“cd ~”会改变工作目录为用户的家目录,而且当用户发现自己在终端中迷失了路径时,非常有用。“cd ..”从当前工作目录切换到(当前工作目录的)父目录。

这些命令肯定会让你在Linux上很舒服。但是这并不是结束。不久,我就会写一些其它的针对于中级用户的有用命令。例如,如果你熟练使用这些命令,欢呼吧,少年,你会发现你已从小白级别提升为了中级用户了。在下篇文章,我会介绍像“kill”,”ps“,”grep“等等命令,期待吧,我不会让你失望的。

 

英文原文:20 Useful Commands for Linux Newbies

 

via http://www.oschina.net/translate/useful-linux-commands-for-newbies 

Linux:使用“~.”退出无响应的 SSH 连接

大家有时候会发现 ssh 挂在那里没有响应了,可能是客户端的问题,也可能是服务器端的问题,也可能是客户端和服务器之间的网络问题;可能是客户端电脑休眠后连接断了、可能是网络断了、可能是 WiFi 信号不好、可能是网络延迟大了、可能是服务器挂了、也可能是服务器上的 sshd 进程挂了,…,可能是技术问题,也可能是非技术问题,可以找出无数可能。

我常遇到或者说每天都遇到的情形是,离开办公桌前忘了退出 ssh 会话。工作的时候长时间 ssh 到服务器上,工作完盖上 Mac 走人,回家后发现那些没退出的 ssh 会话还挂在那里,无法退出、无法 Ctrl+C、无法做任何操作。

我的粗暴做法通常是直接关闭 Terminal 后重新开一个新的;如果用的不是图形系统,没有窗口可以关闭,那还要启用另一个终端找到相关进程后 kill 掉,如果每天都要搞这么几次还是挺烦人的。

今天无意中从同事那里学到了一个小技巧,在那些没退出的 ssh 会话里用 ~. “优雅” 的断开连接。

~.

查看一下 man 帮助文件发现已经有说明,惭愧的是用了这么多年 ssh 才发现有这么一招:

$ man ssh
...
ESCAPE CHARACTERS
     ...
     The supported escapes (assuming the default `~') are:
     ~.      Disconnect.

via http://www.vpsee.com/2013/08/how-to-kill-an-unresponsive-ssh-connection/ 

Linux:Linux 性能监测工具

一个完整运行的 Linux 系统包括很多子系统(介绍,CPU,Memory,IO,Network,…),监测和评估这些子系统是性能监测的一部分。我们往往需要宏观的看整个系统状态,也需要微观的看每个子系统的运行情况。

幸运的是,我们不必重复造轮子,监控这些子系统都有相应的工具可用,这些经过时间考验、随 Unix 成长起来、简单而优雅的小工具是我们日常 Unix/Linux 工作不可缺少的部分。

下面这张图片很好的总结了 Linux 各个子系统以及监控这些子系统所需要的工具,如果你对 Linux 系统管理(sysadmin & devops)感兴趣、想入门的话,可以从这张图开始慢慢了解和熟悉各个工具。对于熟练的 Linux 屌丝,这张图你应该能问答自如。(图片来自:Linux Performance Analysis and Tools,幻灯片也很精彩,建议对照阅读。)

Linux:Linux 性能监测工具
Linux:Linux 性能监测工具

上图里面的各种工具,你用过几个呢?

 

来源:http://www.vpsee.com/2013/06/linux-system-performance-monitoring-tools/ 

Linux:Linux 性能监测:介绍

Linux:Linux 性能监测:介绍
Linux:Linux 性能监测:介绍

看了某某教程、读了某某手册,按照要求改改某某设置、系统设定、内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂、繁琐、长期的工作,优化前需要监测、采集、测试、评估,优化后也需要测试、采集、评估、监测,而且是一个长期和持续的过程,不是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上的优化就适合眼下正在运行的系统,不同的系统、不同的硬件、不同的应用优化的重点也不同、优化的方法也不同、优化的参数也不同。性能监测是系统优化过程中重要的一环,如果没有监测、不清楚性能瓶颈在哪里,优化什么呢、怎么优化呢?所以找到性能瓶颈是性能监测的目的,也是系统优化的关键。系统由若干子系统构成,通常修改一个子系统有可能影响到另外一个子系统,甚至会导致整个系统不稳定、崩溃。所以说优化、监测、测试通常是连在一起的,而且是一个循环而且长期的过程,通常监测的子系统有以下这些:

  • CPU
  • Memory
  • IO
  • Network

这些子系统互相依赖,了解这些子系统的特性,监测这些子系统的性能参数以及及时发现可能会出现的瓶颈对系统优化很有帮助。

应用类型

不同的系统用途也不同,要找到性能瓶颈需要知道系统跑的是什么应用、有些什么特点,比如 web server 对系统的要求肯定和 file server 不一样,所以分清不同系统的应用类型很重要,通常应用可以分为两种类型:

  • IO 相关,IO 相关的应用通常用来处理大量数据,需要大量内存和存储,频繁 IO 操作读写数据,而对 CPU 的要求则较少,大部分时候 CPU 都在等待硬盘,比如,数据库服务器、文件服务器等。
  • CPU 相关,CPU 相关的应用需要使用大量 CPU,比如高并发的 web/mail 服务器、图像/视频处理、科学计算等都可被视作 CPU 相关的应用。

看看实际中的例子,第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
 0  4    140 1962724 335516 4852308  0    0   388 65024 1442  563  0  2 47 52  0
 0  4    140 1961816 335516 4853868  0    0   768 65536 1434  522  0  1 50 48  0
 0  4    140 1960788 335516 4855300  0    0   768 48640 1412  573  0  1 50 49  0
 0  4    140 1958528 335516 4857280  0    0  1024 65536 1415  521  0  1 41 57  0
 0  5    140 1957488 335516 4858884  0    0   768 81412 1504  609  0  2 50 49  0

第2个是 CPU 做大量计算时表现出来的特征:

$ 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
 4  0    140 3625096 334256 3266584  0    0     0    16 1054  470 100 0  0  0  0
 4  0    140 3625220 334264 3266576  0    0     0    12 1037  448 100 0  0  0  0
 4  0    140 3624468 334264 3266580  0    0     0   148 1160  632 100 0  0  0  0
 4  0    140 3624468 334264 3266580  0    0     0     0 1078  527 100 0  0  0  0
 4  0    140 3624712 334264 3266580  0    0     0    80 1053  501 100 0  0  0  0

上面两个例子最明显的差别就是 id 一栏,代表 CPU 的空闲率,拷贝文件时候 id 维持在 50% 左右,CPU 大量计算的时候 id 基本为 0。

底线

我们如何知道系统性能是好还是差呢?这需要事先建立一个底线,如果性能监测得到的统计数据跨过这条线,我们就可以说这个系统性能差,如果数据能保持在线内我们就说性能好。建立这样底线需要知道一些理论、额外的负载测试和系统管理员多年的经验。如果自己没有多年的经验,有一个简单划底线的办法就是:把这个底线建立在自己对系统的期望上。自己期望这个系统有个什么样的性能,这是一个底线,如果没有达到这个要求就是性能差。比如,VPSee 上个月有个 RAID0 的测试,期望的测试结果应该是 RAID0 的 IO 性能比单硬盘有显著提高,底线是 RAID0 的 IO 至少要比单硬盘要好(好多少不重要,底线是至少要好),测试结果却发现 RAID0 性能还不如单硬盘,说明性能差,这个时候需要问个为什么,这往往是性能瓶颈所在,经过排查发现是原硬盘有硬件瑕疵造成性能测试结果错误。

监测工具

我们只需要简单的工具就可以对 Linux 的性能进行监测,以下是 VPSee 常用的工具:

工具 简单介绍
top 查看进程活动状态以及一些系统状况
vmstat 查看系统状态、硬件和系统信息等
iostat 查看CPU 负载,硬盘状况
sar 综合工具,查看系统状况
mpstat 查看多处理器状况
netstat 查看网络状况
iptraf 实时网络状况监测
tcpdump 抓取网络数据包,详细分析
tcptrace 数据包分析工具
netperf 网络带宽工具
dstat 综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息

 

来源:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-introduction/

Linux:Linux 性能监测:Network

Linux:Linux 性能监测:Network
Linux:Linux 性能监测:Network

网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过 ethtool 工具来查看网卡的配置和工作模式:

# /sbin/ethtool eth0
Settings for eth0:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Half 1000baseT/Full
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Half 1000baseT/Full
	Advertised auto-negotiation: Yes
	Speed: 100Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 1
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: g
	Wake-on: g
	Current message level: 0x000000ff (255)
	Link detected: yes

上面给出的例子说明网卡有 10baseT,100baseT 和 1000baseT 三种选择,目前正自适应为 100baseT(Speed: 100Mb/s)。可以通过 ethtool 工具强制网卡工作在 1000baseT 下:

# /sbin/ethtool -s eth0 speed 1000 duplex full autoneg off

iptraf

两台主机之间有网线(或无线)、路由器、交换机等设备,测试两台主机之间的网络性能的一个办法就是在这两个系统之间互发数据并统计结果,看看吞吐量、延迟、速率如何。iptraf 就是一个很好的查看本机网络吞吐量的好工具,支持文字图形界面,很直观。下面图片显示在 100 mbps 速率的网络下这个 Linux 系统的发送传输率有点慢,Outgoing rates 只有 66 mbps.

# iptraf -d eth0

linux system performance monitoring: network

 

netperf

netperf 运行在 client/server 模式下,比 iptraf 能更多样化的测试终端的吞吐量。先在服务器端启动 netserver:

# netserver
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC

然后在客户端测试服务器,执行一次持续10秒的 TCP 测试:

# netperf -H 172.16.38.36 -l 10
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.38.36 (172.16.38.36) port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
 87380  16384  16384    10.32      93.68

从以上输出可以看出,网络吞吐量在 94mbps 左右,对于 100mbps 的网络来说这个性能算的上很不错。上面的测试是在服务器和客户端位于同一个局域网,并且局域网是有线网的情况,你也可以试试不同结构、不同速率的网络,比如:网络之间中间多几个路由器、客户端在 wi-fi、VPN 等情况。

netperf 还可以通过建立一个 TCP 连接并顺序地发送数据包来测试每秒有多少 TCP 请求和响应。下面的输出显示在 TCP requests 使用 2K 大小,responses 使用 32K 的情况下处理速率为每秒243:

# netperf -t TCP_RR -H 172.16.38.36 -l 10 -- -r 2048,32768
TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.38.36 (172.16.38.36) port 0 AF_INET
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate
bytes  Bytes  bytes    bytes   secs.    per sec
16384  87380  2048     32768   10.00     243.03
16384  87380

iperf

iperf 和 netperf 运行方式类似,也是 server/client 模式,先在服务器端启动 iperf:

# iperf -s -D
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Running Iperf Server as a daemon
The Iperf daemon process ID : 5695

然后在客户端对服务器进行测试,客户端先连接到服务器端(172.16.38.36),并在30秒内每隔5秒对服务器和客户端之间的网络进行一次带宽测试和采样:

# iperf -c 172.16.38.36 -t 30 -i 5
------------------------------------------------------------
Client connecting to 172.16.38.36, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[  3] local 172.16.39.100 port 49515 connected with 172.16.38.36 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 5.0 sec  58.8 MBytes  98.6 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3]  5.0-10.0 sec  55.0 MBytes  92.3 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3] 10.0-15.0 sec  55.1 MBytes  92.4 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3] 15.0-20.0 sec  55.9 MBytes  93.8 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3] 20.0-25.0 sec  55.4 MBytes  92.9 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3] 25.0-30.0 sec  55.3 MBytes  92.8 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec    335 MBytes  93.7 Mbits/sec

tcpdump 和 tcptrace

tcmdump 和 tcptrace 提供了一种更细致的分析方法,先用 tcpdump 按要求捕获数据包把结果输出到某一文件,然后再用 tcptrace 分析其文件格式。这个工具组合可以提供一些难以用其他工具发现的信息:

# /usr/sbin/tcpdump -w network.dmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
511942 packets captured
511942 packets received by filter
0 packets dropped by kernel
# tcptrace network.dmp
1 arg remaining, starting with 'network.dmp'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov  4, 2004
511677 packets seen, 511487 TCP packets traced
elapsed wallclock time: 0:00:00.510291, 1002714 pkts/sec analyzed
trace file elapsed time: 0:02:35.836372
TCP connection info:
  1: zaber:54581 - boulder:111 (a2b)                   6>    5<  (complete)
  2: zaber:833 - boulder:32774 (c2d)                   6>    5<  (complete)
  3: zaber:pcanywherestat - 172.16.39.5:53086 (e2f)    2>    3<
  4: zaber:716 - boulder:2049 (g2h)                  347>  257<
  5: 172.16.39.100:58029 - zaber:12865 (i2j)           7>    5<  (complete)
  6: 172.16.39.100:47592 - zaber:36814 (k2l)        255380> 255378<  (reset)
  7: breakpoint:45510 - zaber:7012 (m2n)               9>    5<  (complete)
  8: zaber:35813 - boulder:111 (o2p)                   6>    5<  (complete)
  9: zaber:837 - boulder:32774 (q2r)                   6>    5<  (complete)
 10: breakpoint:45511 - zaber:7012 (s2t)               9>    5<  (complete)
 11: zaber:59362 - boulder:111 (u2v)                   6>    5<  (complete)
 12: zaber:841 - boulder:32774 (w2x)                   6>    5<  (complete)
 13: breakpoint:45512 - zaber:7012 (y2z)               9>    5<  (complete)

tcptrace 功能很强大,还可以通过过滤和布尔表达式来找出有问题的连接,比如,找出转播大于100 segments 的连接:

# tcptrace -f'rexmit_segs>100' network.dmp

如果发现连接 #10 有问题,可以查看关于这个连接的其他信息:

# tcptrace -o10 network.dmp

下面的命令使用 tcptrace 的 slice 模式,程序自动在当前目录创建了一个 slice.dat 文件,这个文件包含了每隔15秒的转播信息:

# tcptrace -xslice network.dmp
# cat slice.dat
date                segs    bytes  rexsegs rexbytes      new   active
--------------- -------- -------- -------- -------- -------- --------
16:58:50.244708    85055  4513418        0        0        6        6
16:59:05.244708   110921  5882896        0        0        0        2
16:59:20.244708   126107  6697827        0        0        1        3
16:59:35.244708   151719  8043597        0        0        0        2
16:59:50.244708    37296  1980557        0        0        0        3
17:00:05.244708       67     8828        0        0        2        3
17:00:20.244708      149    22053        0        0        1        2
17:00:35.244708       30     4080        0        0        0        1
17:00:50.244708       39     5688        0        0        0        1
17:01:05.244708       67     8828        0        0        2        3
17:01:11.081080       37     4121        0        0        1        3

 

来源:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-network/ 

Linux:Linux 性能监测:CPU

Linux:Linux 性能监测:CPU
Linux:Linux 性能监测:CPU

CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中断让 CPU 知道拷贝已经完成;科学计算通常占用较多的 CPU,大部分计算工作都需要在 CPU 上完成,内存、硬盘等子系统只做暂时的数据存储工作。

要想监测和理解 CPU 的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。这里 VPSee 用个例子来简单介绍一下这些概念和他们的关系,CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。

CPU 也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,用来管理和分配 CPU 资源,合理安排进程抢占 CPU,并决定哪个进程该使用 CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个 CPU 都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked 正在等待 IO)要么在可运行状态,如果 CPU 当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。VPSee 在这里要讨论的是性能监测,上面谈了一堆都没提到性能,那么这些概念和性能监测有什么关系呢?关系重大。如果你是老板,你如何检查打工仔的效率(性能)呢?我们一般会通过以下这些信息来判断打工仔是否偷懒:

  • 打工仔接受和完成多少任务并向老板汇报了(中断);
  • 打工仔和老板沟通、协商每项工作的工作进度(上下文切换);
  • 打工仔的工作列表是不是都有排满(可运行队列);
  • 打工仔工作效率如何,是不是在偷懒(CPU 利用率)。

现在把打工仔换成 CPU,我们可以通过查看这些重要参数:中断、上下文切换、可运行队列、CPU 利用率来监测 CPU 的性能。

底线

上一篇 Linux 性能监测:介绍 提到了性能监测前需要知道底线,那么监测 CPU 性能的底线是什么呢?通常我们期望我们的系统能到达以下目标:

  • CPU 利用率,如果 CPU 有 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;
  • 上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;
  • 可运行队列,每个可运行队列不应该超过3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

vmstat

vmstat 是个查看系统整体性能的小工具,小巧、即使在很 heavy 的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。

$ 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
 2  1    140 2787980 336304 3531996  0    0     0   128 1166 5033  3  3 70 25  0
 0  1    140 2788296 336304 3531996  0    0     0     0 1194 5605  3  3 69 25  0
 0  1    140 2788436 336304 3531996  0    0     0     0 1249 8036  5  4 67 25  0
 0  1    140 2782688 336304 3531996  0    0     0     0 1333 7792  6  6 64 25  0
 3  1    140 2779292 336304 3531992  0    0     0    28 1323 7087  4  5 67 25  0

参数介绍:

  • r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;
  • b,被 blocked 的进程数,正在等待 IO 请求;
  • in,被处理过的中断数
  • cs,系统上正在做上下文切换的数目
  • us,用户占用 CPU 的百分比
  • sy,内核和中断占用 CPU 的百分比
  • wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
  • id,CPU 完全空闲的百分比

举两个现实中的例子来实际分析一下:

$ 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
 4  0    140 2915476 341288 3951700  0    0     0     0 1057  523 19 81  0  0  0
 4  0    140 2915724 341296 3951700  0    0     0     0 1048  546 19 81  0  0  0
 4  0    140 2915848 341296 3951700  0    0     0     0 1044  514 18 82  0  0  0
 4  0    140 2915848 341296 3951700  0    0     0    24 1044  564 20 80  0  0  0
 4  0    140 2915848 341296 3951700  0    0     0     0 1060  546 18 82  0  0  0

从上面的数据可以看出几点:

  1. interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;
  2. system time(sy)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU(不断请求资源);
  3. run queue(r)刚好在4个。
$ 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
14  0    140 2904316 341912 3952308  0    0     0   460 1106 9593 36 64  1  0  0
17  0    140 2903492 341912 3951780  0    0     0     0 1037 9614 35 65  1  0  0
20  0    140 2902016 341912 3952000  0    0     0     0 1046 9739 35 64  1  0  0
17  0    140 2903904 341912 3951888  0    0     0    76 1044 9879 37 63  0  0  0
16  0    140 2904580 341912 3952108  0    0     0     0 1055 9808 34 65  1  0  0

从上面的数据可以看出几点:

  1. context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;
  2. 进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);
  3. run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

mpstat

mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据,下面的输出显示 CPU1 和 CPU2 基本上没有派上用场,系统有足够的能力处理更多的任务。

$ mpstat -P ALL 1
Linux 2.6.18-164.el5 (vpsee) 	11/13/2009
02:24:33 PM CPU  %user %nice  %sys %iowait  %irq  %soft %steal  %idle    intr/s
02:24:34 PM all   5.26  0.00  4.01   25.06  0.00   0.00   0.00  65.66   1446.00
02:24:34 PM   0   7.00  0.00  8.00    0.00  0.00   0.00   0.00  85.00   1001.00
02:24:34 PM   1  13.00  0.00  8.00    0.00  0.00   0.00   0.00  79.00    444.00
02:24:34 PM   2   0.00  0.00  0.00  100.00  0.00   0.00   0.00   0.00      0.00
02:24:34 PM   3   0.99  0.00  0.99    0.00  0.00   0.00   0.00  98.02      0.00

ps

如何查看某个程序、进程占用了多少 CPU 资源呢?下面是 Firefox 在 VPSee 的一台 Sunray 服务器上的运行情况,当前只有2个用户在使用 Firefox:

$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'firefox'; sleep 1; done
  PID  NI PRI %CPU PSR COMMAND
 7252   0  24  3.2   3 firefox
 9846   0  24  8.8   0 firefox
 7252   0  24  3.2   2 firefox
 9846   0  24  8.8   0 firefox
 7252   0  24  3.2   2 firefox

 

来源:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-cpu/

Linux:对中级 Linux 用户有用的 20 个命令

也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令 的一个延伸。 

第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户。在这里你将学会如何进行自定义搜索,知道正在进行的进程和停掉进程,如何使用Linux的强势功能和如何在系统内编译C,C++和JAVA程序。

21. 命令: Find

搜索指定目录下的文件,从开始于父目录,然后搜索子目录。

注意: `-name‘选项是搜索大小写敏感。可以使用`-iname‘选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;‘.sh‘你可以使用文件名或者文件名的一部分来制定输出结果)

Linux:对中级 Linux 用户有用的 20 个命令
Linux:对中级 Linux 用户有用的 20 个命令

注意:以上命令查找根目录下和所有文件夹以及加载的设备的子目录下的所有包含‘tar.gz’的文件。

’find’命令的更详细信息请参考35 Find Command Examples in Linux

22. 命令: grep

grep‘命令搜索指定文件中包含给定字符串或者单词的行。举例搜索‘/etc/passwd‘文件中的‘tecmint’

 

使用’-i’选项将忽略大小写。
使用’-r’选项递归搜索所有自目录下包含字符串 “127.0.0.1“.的行。
Linux:对中级 Linux 用户有用的 20 个命令
Linux:对中级 Linux 用户有用的 20 个命令



Linux:Linux 性能监测:Memory

Linux:Linux 性能监测:Memory
Linux:Linux 性能监测:Memory

这里的讲到的 “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存 ”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且 RAM 和 SWAP 之间的交换增加了系统的负担。

在操作系统里,虚拟内存被分成页,在 x86 系统上每个页大小是 4KB。Linux 内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。内存和 SWAP 的这种交换过程称为页面交换(Paging),值得注意的是 paging 和 swapping 是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping 也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和 paging 只交换程序的部分(页面)是两个不同的概念。纯粹的 swapping 在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上实现的。

虚拟内存管理是 Linux 内核里面最复杂的部分,要弄懂这部分内容可能需要一整本书的讲解。VPSee 在这里只介绍和性能监测有关的两个内核进程:kswapd 和 pdflush。

  • kswapd daemon 用来检查 pages_high 和 pages_low,如果可用内存少于 pages_low,kswapd 就开始扫描并试图释放 32个页面,并且重复扫描释放的过程直到可用内存大于 pages_high 为止。扫描的时候检查3件事:1)如果页面没有修改,把页放到可用内存列表里;2)如果页面被文件系统修改,把页面内容写到磁盘上;3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。
  • pdflush daemon 用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬盘,由 pdflush 决定什么时候把相应页面写入硬盘,这由一个内核参数 vm.dirty_background_ratio 来控制,比如下面的参数显示脏页面(dirty pages)达到所有内存页面10%的时候开始写入硬盘。
# /sbin/sysctl -n vm.dirty_background_ratio
10

vmstat

继续 vmstat 一些参数的介绍,上一篇 Linux 性能监测:CPU 介绍了 vmstat 的部分参数,这里介绍另外一部分。以下数据来自 VPSee 的一个 256MB RAM,512MB SWAP 的 Xen VPS:

# 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
 0  3 252696  2432   268   7148 3604 2368  3608  2372  288  288  0  0 21 78  1
 0  2 253484  2216   228   7104 5368 2976  5372  3036  930  519  0  0  0 100  0
 0  1 259252  2616   128   6148 19784 18712 19784 18712 3821 1853  0  1  3 95  1
 1  2 260008  2188   144   6824 11824 2584 12664  2584 1347 1174 14  0  0 86  0
 2  1 262140  2964   128   5852 24912 17304 24952 17304 4737 2341 86 10  0  0  4
  • swpd,已使用的 SWAP 空间大小,KB 为单位;
  • free,可用的物理内存大小,KB 为单位;
  • buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
  • cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
  • si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
  • so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
  • bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
  • bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;

上面是一个频繁读写交换区的例子,可以观察到以下几点:

  • 物理可用内存 free 基本没什么显著变化,swapd 逐步增加,说明最小可用的内存始终保持在 256MB X 10% = 2.56MB 左右,当脏页达到10%的时候(vm.dirty_background_ratio = 10)就开始大量使用 swap;
  • buff 稳步减少说明系统知道内存不够了,kwapd 正在从 buff 那里借用部分内存;
  • kswapd 持续把脏页面写到 swap 交换区(so),并且从 swapd 逐渐增加看出确实如此。根据上面讲的 kswapd 扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到 swap,所以这里 swapd 持续增加。

来源:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-memory/ 

Linux:Indicator Weather 13.06 发布 增加 Kelvin 支持

Indicator Weather 是一个天气工具,可以在桌面上查看到天气信息。新版中增加了 Kelvin 温度单位。可以在 Indicator Weather appindicator–>Preferences–>Units the user is to observe a selectable Kelvin (K) 中设定。

Linux:Indicator Weather 13.06 发布 增加 Kelvin 支持
Linux:Indicator Weather 13.06 发布 增加 Kelvin 支持

安装 Indicator Weather 13.06 非常简单,只需要打开一个终端然后在其中键入如下命令即可(支持 Ubuntu 12.04, Ubuntu 12.10, Ubuntu 13.04, Ubuntu 13.10 版本系统):

sudo add-apt-repository ppa:weather-indicator-team/ppasudo apt-get updatesudo apt-get install indicator-weather

 已同步至 linux的微博

来源:https://linux.cn/article-1796-1.html

Linux:Linux 性能监测:IO

Linux:Linux 性能监测:IO
Linux:Linux 性能监测:IO

磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。

内存页

上一篇 Linux 性能监测:Memory 提到了内存和硬盘之间的 IO 是以页为单位来进行的,在 Linux 系统上1页的大小为 4K。可以用以下命令查看系统默认的页面大小:

$ /usr/bin/time -v date
	...
	Page size (bytes): 4096
	...

缺页中断

Linux 利用虚拟内存极大的扩展了程序地址空间,使得原来物理内存不能容下的程序也可以通过内存和硬盘之间的不断交换(把暂时不用的内存页交换到硬盘,把需要的内存页从硬盘读到内存)来赢得更多的内存,看起来就像物理内存被扩大了一样。事实上这个过程对程序是完全透明的,程序完全不用理会自己哪一部分、什么时候被交换进内存,一切都有内核的虚拟内存管理来完成。当程序启动的时候,Linux 内核首先检查 CPU 的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

上面的内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。很显然,把多余的内存拿出来做成内存缓存区提高了访问速度,这里还有一个命中率的问题,运气好的话如果每次缺页都能从内存缓存区读取的话将会极大提高性能。要提高命中率的一个简单方法就是增大内存缓存区面积,缓存区越大预存的页面就越多,命中率也会越高。下面的 time 命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:

$ /usr/bin/time -v date
	...
	Major (requiring I/O) page faults: 1
	Minor (reclaiming a frame) page faults: 260
	...

File Buffer Cache

从上面的内存缓存区(也叫文件缓存区 File Buffer Cache)读取页比从硬盘读取页要快得多,所以 Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。我们运行 Linux 一段时间后会发现虽然系统上运行的程序不多,但是可用内存总是很少,这样给大家造成了 Linux 对内存管理很低效的假象,事实上 Linux 把那些暂时不用的物理内存高效的利用起来做预存(内存缓存区)呢。下面打印的是 VPSee 的一台 Sun 服务器上的物理内存和文件缓存区的情况:

$ cat /proc/meminfo
MemTotal:      8182776 kB
MemFree:       3053808 kB
Buffers:        342704 kB
Cached:        3972748 kB

这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB 左右用来做磁盘缓存(Buffers),4GB 左右用来做文件缓存区(Cached),可见 Linux 真的用了很多物理内存做 Cache,而且这个缓存区还可以不断增长。

页面类型

Linux 中内存页面有三种类型:

  • Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
  • Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存。
  • Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。

IO’s Per Second(IOPS)

每次磁盘 IO 请求都需要一定的时间,和访问内存比起来这个等待时间简直难以忍受。在一台 2001 年的典型 1GHz PC 上,磁盘随机访问一个 word 需要 8,000,000 nanosec = 8 millisec,顺序访问一个 word 需要 200 nanosec;而从内存访问一个 word 只需要 10 nanosec.(数据来自:Teach Yourself Programming in Ten Years)这个硬盘可以提供 125 次 IOPS(1000 ms / 8 ms)。

顺序 IO 和 随机 IO

IO 可分为顺序 IO 和 随机 IO 两种,性能监测前需要弄清楚系统偏向顺序 IO 的应用还是随机 IO 应用。顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序 IO 可以同时很快的移动大量数据。可以这样来评估 IOPS 的性能,用每秒读写 IO 字节数除以每秒读写 IOPS 数,rkB/s 除以 r/s,wkB/s 除以 w/s. 下面显示的是连续2秒的 IO 情况,可见每次 IO 写的数据是增加的(45060.00 / 99.00 = 455.15 KB per IO,54272.00 / 112.00 = 484.57 KB per IO)。相对随机 IO 而言,顺序 IO 更应该重视每次 IO 的吞吐能力(KB per IO):

$ iostat -kx 1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    2.50   25.25    0.00   72.25
Device:rrqm/s   wrqm/s   r/s   w/s   rkB/s    wkB/s avgrq-sz avgqu-sz  await svctm %util
sdb     24.00 19995.00 29.00 99.00 4228.00 45060.00   770.12    45.01 539.65  7.80 99.80
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    1.00   30.67    0.00   68.33
Device:rrqm/s   wrqm/s  r/s   w/s  rkB/s    wkB/s avgrq-sz avgqu-sz  await svctm  %util
sdb      3.00 12235.00 3.00 112.00 768.00 54272.00   957.22   144.85 576.44  8.70 100.10

随机 IO 是指随机请求数据,其 IO 速度不依赖于数据的大小和排列,依赖于磁盘的每秒能 IO 的次数,比如 Web 服务、Mail 服务等每次请求的数据都很小,随机 IO 每秒同时会有更多的请求数产生,所以磁盘的每秒能 IO 多少次是关键。

$ iostat -kx 1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.75    0.00    0.75    0.25    0.00   97.26
Device:rrqm/s wrqm/s  r/s   w/s rkB/s  wkB/s avgrq-sz avgqu-sz await svctm %util
sdb      0.00  52.00 0.00 57.00  0.00 436.00    15.30     0.03  0.54  0.23  1.30
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.75    0.00    0.75    0.25    0.00   97.24
Device:rrqm/s wrqm/s  r/s   w/s rkB/s  wkB/s avgrq-sz avgqu-sz await svctm %util
sdb      0.00  56.44 0.00 66.34  0.00 491.09    14.81     0.04  0.54  0.19  1.29

按照上面的公式得出:436.00 / 57.00 = 7.65 KB per IO,491.09 / 66.34 = 7.40 KB per IO. 与顺序 IO 比较发现,随机 IO 的 KB per IO 小到可以忽略不计,可见对于随机 IO 而言重要的是每秒能 IOPS 的次数,而不是每次 IO 的吞吐能力(KB per IO)。

SWAP

当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用 swap 的代价非常大。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们已经有很多工具可以用来监测 swap 和 swapping 情况,比如:top、cat /proc/meminfo、vmstat 等:

$ cat /proc/meminfo
MemTotal:      8182776 kB
MemFree:       2125476 kB
Buffers:        347952 kB
Cached:        4892024 kB
SwapCached:        112 kB
...
SwapTotal:     4096564 kB
SwapFree:      4096424 kB
...
$ 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
 1  2 260008   2188    144   6824 11824 2584 12664  2584 1347 1174 14  0 0 86 0
 2  1 262140   2964    128   5852 24912 17304 24952 17304 4737 2341 86 10 0  0 4

 

来源:http://www.vpsee.com/2009/11/linux-system-performance-monitoring-io/ 

Linux:实用的系统工具之 lsof

lsof 简介

只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种 文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

lsof 的示例输出:

root@YLinux:~/lab 0# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,6 4096 2 /
systemd 1 root rtd DIR 8,6 4096 2 /
systemd 1 root txt REG 8,6 2273340 1834909 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.s
...

lsof 常用使用

文件

查看文件被哪些进程占用

# lsof /dev/tty1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1770 jian 0u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 1u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 2u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 255u CHR 4,1 0t0 1045 /dev/tty1
startx 1845 jian 0u CHR 4,1 0t0 1045 /dev/tty1
startx 1845 jian 1u CHR 4,1 0t0 1045 /dev/tty1
...

文件系统

指定目录,可以看到有哪些进程打开了其下的文件:

# lsof /data/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 15983 jian cwd DIR 8,5 4096 8252 /data/backup
...

这在 umount 某个文件系统失败时非常有用。

进程

指定进程号,可以查看该进程打开的文件:

# lsof -p 2064
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 2064 jian cwd DIR 8,6 4096 1571780 /home/jian
firefox 2064 jian rtd DIR 8,6 4096 2 /
firefox 2064 jian txt REG 8,6 44224 1985670 /usr/lib/firefox-12.0/firefox
firefox 2064 jian mem REG 8,6 14707012 925361 /usr/share/fonts/chinese/msyhbd.ttf
firefox 2064 jian mem REG 8,6 15067744 925362 /usr/share/fonts/chinese/msyh.ttf
firefox 2064 jian mem REG 8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
firefox 2064 jian mem REG 0,16 67108904 10203 /dev/shm/pulse-shm-3021850167
...

网絡

查看指定端口有哪些进程在使用:

# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1569 root 3u IPv4 10303 0t0 TCP *:ssh (LISTEN)
sshd 1569 root 4u IPv6 10305 0t0 TCP *:ssh (LISTEN)
...

查看指定网口有哪些进程在使用:

# lsof -i@192.168.1.91
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
skype 1909 jian 54u IPv4 9116 0t0 TCP 192.168.1.91:40640->64.4.23.153:40047 (ESTABLISHED)
pidgin 1973 jian 7u IPv4 6599 0t0 TCP 192.168.1.91:59311->hx-in-f125.1e100.net:https (ESTABLISHED)
pidgin 1973 jian 13u IPv4 9260 0t0 TCP 192.168.1.91:54447->by2msg3010511.phx.gbl:msnp (ESTABLISHED)
...

更多使用

用戶

查看指定用戶打开的文件:

# lsof -u messagebus
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 1805 messagebus cwd DIR 8,6 4096 2 /
dbus-daem 1805 messagebus rtd DIR 8,6 4096 2 /
dbus-daem 1805 messagebus txt REG 8,6 1235361 1834948 /usr/bin/dbus-daemon
dbus-daem 1805 messagebus mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.so
dbus-daem 1805 messagebus mem REG 8,6 190145 1700642 /lib/libnss_nis-2.15.so
dbus-daem 1805 messagebus mem REG 8,6 490366 1700636 /lib/libnsl-2.15.so
...

程序

查看指定程序打开的文件:

# lsof -c firefox
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 2064 jian cwd DIR 8,6 4096 1571780 /home/jian
firefox 2064 jian rtd DIR 8,6 4096 2 /
firefox 2064 jian txt REG 8,6 44224 1985670 /usr/lib/firefox-12.0/firefox
firefox 2064 jian mem REG 8,6 14707012 925361 /usr/share/fonts/chinese/msyhbd.ttf
firefox 2064 jian mem REG 8,6 15067744 925362 /usr/share/fonts/chinese/msyh.ttf
firefox 2064 jian mem REG 8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
...

命令使用

组合查询条件

只有多个查询条件都满足, 用 “-a” 参数。

# lsof -a -c bash -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1986 root cwd DIR 8,6 4096 1701593 /root/lab
bash 1986 root rtd DIR 8,6 4096 2 /
bash 1986 root txt REG 8,6 1994157 1700632 /bin/bash
bash 1986 root mem REG 8,6 9690800 405214 /usr/lib/locale/locale-archive
bash 1986 root mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.so

via http://www.ylinux.org/forum/t/276 

 

Linux:优化GNU/Linux桌面安装的九个步骤

  配置GNU/Linux的工作不是说安装光盘弹出来后,甚至不是说安装后向导运行后就算完成了。虽说安装后你面对的是个基本系统,却不是你的所有偏好和需求都已经考虑在内的优化后系统。考虑到操作系统的大小和复杂性,别指望系统安装后就让你称心如意–在Windows上完成安装后基本上也是这种情形。

  要是你对GNU/Linux有所了解,也许知道你不需要碎片整理工具,也不需要为反病毒软件过于操心。但是你还需要做其他的什么事情呢?就这个问题而言,大多数发行版基本上保持沉默,不过安装自己的操作系统的用户数量只是所有计算机用户中的一小部分。现在,你甚至无法想当然地认为所有GNU/Linux用户都安装了自己的操作系统。

  为了弥补这个不足,你在安装GNU/Linux后应该考虑下列九个步骤。我花了好多个晚上调整自己家里的众多桌面计算机后才写成了这篇指南文章。逐一遵照这些步骤是要花些时间,但如果你果真这么做,就有助于确保你在使用新安装的操作系统时更轻松自如。

一、更新你的系统

  新版本的自由软件程序在不断发布出来。由于这个原因,来自你已安装系统的CD或DVD映像文件已经过时的可能性相当大。正因为如此,你在安装后的第一步应该是升级系统。除了你自然希望拥有最新的工具不说,你还会得到最新的安全补丁。你会在基本上毋需解释的桌面面板上的通知托盘中找到更新图标。

二、启用安全功能

  就因为GNU/Linux不受病毒困扰、采用了安全设计,并不是说你就可以随便冒险了。一旦你更新了系统,应该采取的下一步是,确保你系统的安全工具在为你发挥作用。

  在Debian、Fedora、Gentoo、Mandrake、红帽和SuSE等发行版上,你能够采取的最重要的一个步骤就是,安装和运行Bastille.bastille是一个系统加固工具,同时可以教你一些安全常识,建议采取确保系统安全的标准方法,并提议为什么可能需要各个选项.bastille的开发者Jay Beale建议,该工具的选项也许是你所需要的安全机制。

  不过,要是你的发行版有SELinux或AppArmor,你可能还要考虑使用它们来加强安全。这么做的话,系统性能可能会下降几个百分点,但是性能受影响的程度小于在后台运行病毒扫描工具。

  尤其是SELinux以配置困难而出名,但在Fedora等一些发行版中,它又是安装的一个标准部分,图形化工具可以处理它的一些基本操作。

  你在考虑安全时,如果你与Windows用户交换文件,或者与同一台计算机上安装的Windows系统(下文有介绍)交换文件,可能还应该安装Clam反病毒工具。你的GNU/Linux发行版不需要它,但安装的Windows系统可能需要它。

三、安装打印机

  如今,GNU/Linux安装程序、尤其是面向新用户的那些安装程序,通常能检测到你的大部分硬件,包括互联网连接。但由于某个原因,大多数安装程序(包括Windows的安装程序)忽略了打印机配置,尽管普通计算机已连接至打印机。

  幸好,如今打印机配置起来很容易。你需要的工具是GNOME菜单中的System(系统)> Administration(管理)> Printing(打印),以及KDE 4菜单中的Administration(管理)> Printing(打印)。你可能想要以根用户的身份安装,那样每个人可以使用该打印机,不过你在KDE中的确有这个选项:只为当前帐户启用打印机。无论借助上述哪种工具,你都需要插上计算机,然后按指示操作。

  如果你的打印机没有列出来,可以到Linux打印机数据库里面找找。可能会找到关于让你那台打印机正常工作的其他驱动程序的信息。如果是PostScript打印机,你在按指示操作时,只需要选择通用PostScript驱动程序。

四、选择和配置电子软件阅读器

  就跟在Windows上一样,在GNU/Linux上,你也需要在安装后配置电子邮件阅读器,输入用于收发邮件的信息,比如地址、密码和服务器。你可以从现有的操作系统获得这些信息;必要的话,也可以从你的互联网服务提供商(ISP)获得这些信息。

  自由软件至少包括十几种邮件阅读器,但最常见的是GNOME的Evolution、KDE的KMail和Thunderbird(火狐Web浏览器的配套应用程序)。对习惯使用Outlook的那些用户而言,Evolution似乎最熟悉,它有内置的联系人列表和备忘录,但是上述这三款应用程序在功能特性上都大体相似.thunderbird尤其大受欢迎,因为它在Windows上也可以使用。

  不管你选择了哪款邮件阅读器,启用电子邮件都很直观简单,只要你有必要的信息.evolution和Thunderbird都含有可以指导你的向导,但是如果你有条不紊地操作,KMail安装起来几乎一样容易。

  一旦你安装了邮件阅读器,可能还要花点时间来配置其邮件过滤器,以便将邮件发送到不同的文件夹,并识别垃圾邮件。

五、决定要不要使用专有的驱动程序、编解码器和阅读器

  GNU/Linux桌面在不断改进。不过,为了恪守自由软件理念,许多发行版选择了不随带专有软件,哪怕专有软件明明可以增强功能。

  你应该趁早决定要不要尝试使用专有组件。可能最常用的专有软件是ATI或英伟达显卡的视频驱动程序。如果是办公套件,你不需要操心;但是如果你是游戏玩家、动画师或CAD用户,或者想试一试复合窗口管理器–简而言之,如果你预计处理的任务需要三维加速,那么你可能需要探究专有的视频驱动程序。

  你可能需要的其他专有组件是用于音频和视频格式的MP3和Win32编解码器。相比之下,你用免费的PDF阅读器也许能应付过去。而就许多用途而言,Gnash正开始成为一款尚可接受的Adobe Flash阅读器,而免费版本的Java足以取代Sun Java。

  其中一些专有软件也许就在你发行版的软件库中。在其他情况下,你可能需要访问某个特定的下载网站或非官方软件库,这取决于专有软件或发行版。在你发行版的邮件列表中找一番,也许能找到需要的来源,但是切记:非官方软件库有时会引起兼容问题,需要花好长时间去分析,才能查明问题根源、解决问题。这些问题就好比是你为自由软件理想而付出的代价。

六、选择如何在GNU/Linux与Windows之间共享

  许多GNU/Linux安装在双引导系统上,你开启计算机后,引导管理器就会打开,你可以从中选择引导Windows还是引导GNU/Linux。如果你经常需要在这两种操作系统之间来回切换,恐怕需要决定如何共享文件。

  你应该可以轻而易举地从GNU/Linux读取Windows上的文件。实际上,许多发行版在安装过程中已经准备好了这项功能。就算没有,可以在/mnt目录(这是访问分区的传统地方)下创建子文件夹,并使用mount命令来访问你的Windows分区。唯一复杂的部分是分区名称,而如今,分区名称可能是/dev/sda1,所以典型的命令会是:mount /dev/sda1 /mnt/share。为了让自己没必要使用该命令,你可以编辑/etc/fstab文件–该文件列出了每当机器启动就能访问的那些分区,从而自动访问Windows分区.man fstab这个命令应该会提供你需要的所有帮助,但是需要的话,可以在网上找到更多的帮助。

  如果从Windows读取GNU/Linux上的文件,问题来得较为复杂,原因是Windows无法像GNU/Linux那样可以阅读众多分区格式。如果是偶尔共享一下,用闪驱或者以电子邮件附件方式发给自己应该足以满足需求。不过,如果经常共享,这些方法用起来就不方便。最简单的解决办法就是,使用GParted Live CD(http://gparted.sourceforge.net/livecd.php)–这是相当于Partition Magic的自由软件,创建一个FAT32分区,将你在两个系统中需要的所有文件都存储在该分区上面。由于两种操作系统都能读取这种分区格式,这是最有效的解决办法,如果你为fstab添加了新分区,更是如此。

七、配置你的Web浏览器

  虽然GNU/Linux让用户可以选择几款浏览器,但是火狐及其他基于Mozilla的浏览器(比如Epiphany)仍然最受欢迎。如今,这类浏览器要是没有你偏爱的扩展件就称不上功能齐全–就本人而言,要是没有五六个用于处理标签、保存会话以便即时恢复的扩展件,我会显得很迷茫。

  如果你早已在Windows上使用火狐,就要让装有该操作系统的驱动器能够被GNU/Linux访问(见上文),还要设法将你的书签及其他设置一并迁移过去。我在过去做这件事情时遇到了好坏参半的结果,但总归是值得一试。

八、定制你的桌面

  GNU/Linux桌面具有高度可配置性。虽然你可能不想马上考虑一整套的定制选项,但是可能需要设置桌面背景和字体大小以及类似选项。在GNOME中,你可以在菜单中的System(系统)> Preferences(参数)下面找到基本选项。在KDE 4中,先后找到Settings(设置)> System Settings(系统设置)> Look and Feel and Personal(外观、感觉及个性化)。

九、考虑使用其他应用程序

  发行版包含能想到的一切组件这种时代早过去了。自由软件的魅力仍然在于选择,所以当你完成了基本的安装后工作后,不妨再来点轻松的工作:通过桌面的软件安装工具(通常在主菜单中被标为添加/删除软件之类的选项),看看有什么替代应用程序可用来处理你的其他日常要求。

  用OpenOffice.org还是KOffice?用XChat还是Pidgin?用AmoroK还是Exaile?用KDE、GNOME还是Xfce?由于它们都是免费的、比较小巧,你可以安装所有替代应用程序,用不了多久;而且可以同样快速地删除不需要的应用程序。

备份配置结果

  就算你知道自己在干嘛,所有这些安装后的配置工作也要花时间。为了不必重新配置,一旦你完成了配置,就要备份系统。起码应该备份/home和/etc这两个目录里面的一切内容,因为这些是存放大多数配置和定制参数的地方。软件程序本身不太重要,因为你没必要注册软件,重新安装软件基本上是个开始安装后不用去管它的过程。

  万一你果真需要另一次安装,就可以拷贝/home目录和来自/etc的重要文件,并迅速恢复你的许多定制参数。不过,由于你可能以根用户的身份在备份和恢复文件,切记使用chown和chgrp这两个命令,将已恢复文件的所有权赋予给拥有相应目录的用户。比如说,你应该使用chown -R bsmith /home/bsmith/,为bsmith用户帐户更改文件所有权。

其他步骤

  你所选择的发行版、可用硬件以及你自己的工作要求,这些都将确定你是否需要采取其他步骤来完成GNU/Linux系统的安装。总的趋势是,安装程序在为你接过更重的担子,但一些不是面向新用户的发行版仍要求你处理更多的工作。在一些情况下,你的硬件(尤其是无线网卡、调制解调器和网络摄像头)也可能需要像Ndiswrapper这样的模块,之后系统才可以完全正常使用。同样,图形设计人员可能想使用KDE的Font Installer来添加字体,而处理几种语言的人可能想安装几种不同的地方语言和键盘布局。

  所有这些情况都需要付出额外的工作量。不过好消息是,GNU/Linux的用途极其广泛,足以满足一系列广泛的要求,这是大多数操作系统所无法比拟的。无论你有什么样的需求,GNU/Linux都应该能满足,只要你肯花时间来尝试和配置。按你偏爱的方式配置起来的安全系统就是对你的最大回报。

原文链接:http://www.datamation.com/osrc/article.php/3747066/Nine-Steps-to-Optimal-GNULinux-Desktop-Setup.htm

译文:http://os.51cto.com/art/201308/407373.htm

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

经过开发团队六个月的紧张工作后,KDE 4.11 SC 发布了,这是一个长期支持版本,所以在两年内你可以放心使用。而开发团队将有两年的开发时间来做 KDE Framework 5 和 Qt 5。新版本带来的诸多改进和新功能就不多说了,大家可以看看官方公告(http://kde.org/announcements/4.11/)。

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11
Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

下面来说一下在 Ubuntu 13.104 和 12.04 下的安装命令:

第一步:添加 KDE SC 4.11 库

打开一个终端窗口(Ctrl + Alt + T),在终端窗口中输入如下命令:

sudo add-apt-repository ppa:kubuntu-ppa/backports

回车执行命令,您需要您的管理员密码。

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11
Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

执行完毕后不要关闭窗口。我们继续。

第二步:安装 KDE SC 4.11

在终端窗口中继续输入如下命令并执行:

sudo apt-get update && sudo apt-get install kubuntu-desktop

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11
Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

好了,执行期间您只需要等待 KDE SC 4.11 的下载包下载安装完成。(这可能需要一些时间,因为包文件还是挺多的)。安装完成后,您需要重新启动计算机。

重新启动后,登录界面,您就可以看到 KDE 选择了。

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11
Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

输入您的登录密码,您就可以看到 KDE 桌面了。感受感受吧。

Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11
Linux:如何在 Ubuntu 13.04 和 12.04 下安装 KDE SC 4.11

当然了,如果您在使用 KDE 后,发现它不合您的口味,您可以卸载它。您只需在终端窗口中执行如下命令即可卸载 KDE:

sudo apt-get install -y ppa-purgesudo ppa-purge ppa:kubuntu-ppa/backportssudo apt-get autoremove

来自:http://news.softpedia.com/news/How-to-Install-KDE-SC-4-11-on-Ubuntu-13-04-and-12-04-LTS-375585.shtml

 已同步至 linux的微博

来源:https://linux.cn/article-1819-1.html

Linux:我从其他人的Shell脚本中学到的

我是一个Shell脚本迷,也很喜欢从其他人的Shell脚本里学习一些有趣的东西。最近我偶然接触到用于方便ssh服务器双重认证的 authy-ssh 脚本。 浏览脚本后我学到了一些很酷的东西,在此也想分享给大家。

1. 让你的echo丰富多彩

很多时候,你会想让echo能以多种颜色区分不同输出。比如,绿色表示成功,红色告知失败,黄色提示警告。

NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
function red() {
    echo -e "$RED$*$NORMAL"
}
function green() {
    echo -e "$GREEN$*$NORMAL"
}
function yellow() {
    echo -e "$YELLOW$*$NORMAL"
}
# To print success
green "Task has been completed"
# To print error
red "The configuration file does not exist"
# To print warning
yellow "You have to use higher version."

这里使用 tput 来配置输出颜色,输出文本,最后再恢复默认输出颜色。如果想对 tpu 了解更多,参看 prompt-color-using-tput 。

2. 输出debug信息

仅当设置DEBUG标志时才打印调试信息。

function debug() {
    if [[ $DEBUG ]]
    then
        echo ">>> $*"
    fi
}
# For any debug message
debug "Trying to find config file"

还有来自于一些很酷的Geeks的单行debug函数:

function debug() { ((DEBUG)) && echo ">>> $*"; }
function debug() { [ "$DEBUG" ] && echo ">>> $*"; }

3. 检查特定的可执行文件是否存在

OK=0
FAIL=1
function require_curl() {
    which curl &>/dev/null
    if [ $? -eq 0 ]
    then
      return $OK
    fi
    return $FAIL
}

这里使用 which 命令来查找可执行文件 curl 的路径。如果成功找到,则可执行文件文件是存在的,否则就不存在。 &>/dev/null 将标准输出和标准错误重定向到 /dv/null (也就是不显示在终端上了)。

一些朋友建议可以直接使用 which 返回的状态码。

# From cool geeks at hacker news
function require_curl() { which "curl" &>/dev/null; }
function require_curl() { which -s "curl"; }

4. 显示脚本的使用说明

在我开始写Shell脚本的初期,常会使用 echo 命令显示脚本的使用说明。 但当说明的文字较多时,echo 语句就会变得一团糟。随后我发现,可以使用 cat命令来显示使用说明。

cat << EOF
Usage: myscript 

这里的 << 称为 here document,它可以将字符串放置在两个 EOF 之间。

5. 用户设置 vs. 默认配置

我们有时会希望在用户没有提供设置参数时能够使用默认值。

URL=${URL:-http://localhost:8080}

这一语句检查环境变量 URL ,如果不存在,就将其设置为 localhost。

6. 检查字符串的长度

if [ ${#authy_api_key} != 32 ]
then
  red "you have entered a wrong API key"
  return $FAIL
fi

${#VARIABLE_NAME} 可以给出字符串的长度。

7. 为读取输入设置时限

READ_TIMEOUT=60
read -t "$READ_TIMEOUT" input
# if you do not want quotes, then escape it
input=$(sed "s/[;`"$' ]//g" <<< $input)
# For reading number, then you can escape other characters
input=$(sed 's/[^0-9]*//g' <<< $input)

8. 获取目录名和文件名

# To find base directory
APP_ROOT=`dirname "$0"`
# To find the file name
filename=`basename "$filepath"`
# To find the file name without extension
filename=`basename "$filepath" .html`

完结。 祝各位编程开心,享受这美好的一天吧!

本文翻译自: http://www.fizerkhan.com/blog/posts/What-I-learned-from-other-s-shell-scripts.html 

Linux:每个 MySQL 开发者都应该了解的 12 个技巧

MySQL是世界上实际最流行的数据库管理系统,是遍布全球编程社区的首选。它有一个系列有趣的特性,在很多方面都很擅长。由于其巨大的人气,在网上可以找到许多MySQL的使用技巧。这里有12个最好的技巧和窍门,所有MySQL数据库开发者都应该了解一下。

Linux:每个 MySQL 开发者都应该了解的 12 个技巧
Linux:每个 MySQL 开发者都应该了解的 12 个技巧

1、避免编辑转储文件

Mysqldump创建的转储文件原本是无害的,但它很容易被尝试去编辑。然而,人们应该知道在任何情况下的试图修改这些文件被证明是有危险的。直观地看对这些文件的改动会导致数据库损坏,从而导致系统的退化。为了让你的系统免受任何麻烦,你必须避免编辑MySQL转储文件。

2、MyISAM 块大小

大多数开发者忘记了这一事实,文件系统往往需要一个大的MyISAM块以保证高效运行。许多开发者不知道块大小的设置。.MYI文件存储在myisam_block_size的设置里,这个设置项可用来修改大的块尺寸。MyISAM块大小的默认值是1K,这不是当前大多数系统的恰当设置。因此,开发者应该考虑指定一个与之相适应的值。

3、打开 Delay_Key_Write

为避免系统崩溃时数据库损坏delay_key_write默认是关闭的。有人可能会问,如果是这样的话,为什么要把它放在首位打开呢?从防止数据库每次写MyISAM文件时刷新密钥文件方面看这是必要的。通过把它打开,开发者可以节省很多时间。参考MySQL官方手册了解你的版本如何把它打开。

4、Joins(表连接)

创建索引和使用相同的列类型:join(表连接)操作可以在Mysql中被优化。若应用中有许多join操作,可以通过创建相同的列类型上join来优化。创建索引是加速应用的另一种方法。查询修改有助于你找回期望的查询结果。

5、优化WHERE从句

即使你只搜索一行MySQL也会查询整个表,因此,建议你当只需要一条结果时将limit设置为1。通过这样做,可以避免系统贯穿搜索整个表,从而可以尽可能快找到与你需求相匹配的记录。

6、在Select查询上使用Explain关键字

你肯定希望得到与任何特定查询相关的一些帮助。Explain关键词在这方面是非常有帮助的。它在你寻求查询到底做了什么时提供了具体细节。例如,在复杂join查询前键入Explain关键词你会得到很多有用的资料。

7、使用查询缓存优化查询

MySQL的查询缓存是默认启用的。这主要是因为缓存有助于查询的快速执行,缓存可以在相同的查询多次运行使用。你在关键字前加入当前日期、CURRDATE等PHP代码使查询缓存它从而启用此功能。

8、使用堆栈跟踪隔离Bug

各种Bug可以使用stack_trace隔离出来。一个空指针足以毁掉一段特定的代码,任何开发人员都知道它有这样的能力。了解使用堆栈跟踪的细节,从而在你的代码里避免bug。

9、设置SQL_MODE

枚举类型总是让人感到非常的疑惑。由于字段可能拥有多个可能的值,这些可能的值包括你指定的和null,在编码时将会出现很多问题,你将永远都会得到一个警告说代码不正确。一个简单的解决办法就是设置SQL_MODE。

// 用以下参数启动mysqld
$–sql-mode=”modes”
// 或者在my.ini或 my.cnf 里面设置如下选项
$sql-mode=”modes”
// 也可以在运行时直接设置,使用逗号分隔模式
$set [GLOBAL|SESSION] sql_mode=’modes’
// TRADITIONAL 模式等价于下列模式:STRICT_TRANS_TABLES, STRICT_ALL_TABLES,
// NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO 和 NO_AUTO_CREATE_USER

10、修改Root密码

修改root密码对于某些特定设置是必不可少的,修改命令如下:

// 使用mysqladmin的password命令来修改(4.1格式)
$mysqladmin -u root password [新口令]
// 旧的修改口令的方法
$mysqladmin -u root -p [旧口令] 新口令 [敲回车后输入新口令,然后回车]
// 使用mysql的命令
$mysql -u root -p
mysql> use mysql;
mysql> update user set password=新口令 where User = ‘用户名’;
mysql> flush privileges;
mysql> quit

11、用MySQL Dump 命令备份数据库

开发者都知道数据库备份的重要性,当系统出现重大故障时能够起到救命的作用。

最简单的备份数据库的方法

$mysqldump –user [user name] –password=[password] [database name] > [dump file]

你也可以用简写”-u”,”-p”来分别代替”user”和”password” 将多个数据库导入到一个文件只要在后面添加需要导出数据库的名称: 

mysqldump –user [user name] –password=[password] [first database name] [second database name] > [dump file]

许多数据库都提供了顺序备份的功能,要备份所有数据库只需要添加–all-databases参数。如果你不喜欢命令行,从Sourceforge上下载automysqlbackup吧。

12、调整CONFIG的配置

PERL脚本MySQL Tuner ( http://mysqltuner.com/‎ )是另一个强大的优化数据库性能的工具,它能够帮助你对MySQL配置来进行多处调整和修改。你可以访问该项目的官网来进一步了解它。

 

英文原文:10+ Useful Tricks Every MySQL Database Developer Must Consider 

via http://www.oschina.net/translate/10-useful-tricks-every-mysql-database-developer-must-consider 

 

Linux:Linux 的启动流程

半年前,阮一峰写了《计算机是如何启动的?》,探讨BIOS和主引导记录的作用。那篇文章不涉及操作系统,只与主板的板载程序有关。今天,阮一峰接着往下写了 Linux 的启动流程,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。

这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。

我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。

第一步、加载内核

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

以我的电脑为例,/boot 目录下面大概是这样一些文件:

  $ ls /boot    config-3.2.0-3-amd64  config-3.2.0-4-amd64  grub  initrd.img-3.2.0-3-amd64  initrd.img-3.2.0-4-amd64  System.map-3.2.0-3-amd64  System.map-3.2.0-4-amd64  vmlinuz-3.2.0-3-amd64  vmlinuz-3.2.0-4-amd64

第二步、启动初始化进程

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。

第三步、加载开机启动程序

许多程序是开机启动的。它们在Windows叫做”服务”(service),在Linux就叫做”守护进程“(daemon)。所有”守护进程”的启动脚本,都放在 /etc/init.d 目录下面。init进程的主要任务,就是逐一运行这些脚本。

下面是我的电脑的 /etc/init.d 目录,里面有很多程序。

  $ ls /etc/init.d    acpid  alsa-utils  anacron  apache2  atd  avahi-daemon  binfmt-support  …

/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

第四步、运行级别

有些开机启动程序,并不需要所有场合都启动。比如,把Linux当作桌面环境时,就不需要启动 Apache。系统允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别“(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。

Linux:Linux 的启动流程
Linux:Linux 的启动流程

Linux默认提供七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。其他级别每个发行版不太一样,对于Debian来说,2到5都是同样的多用户模式(也就是正常模式)。

打开文件 /etc/inittab,可以看到第一行是这样的:

  id:2:initdefault:

这就是说,启动时的默认运行级别为2,用户可以修改这个值。

init进程读取 /etc/inittab 文件,然后按照指定的”运行级别”,加载相应的开机启动程序。那么,系统怎么知道每个级别应该加载哪些程序呢?

回答是每个运行级别在 /etc 目录下面都有一个对应的子目录,里面指定了要加载的程序。

  /etc/rc0.d  /etc/rc1.d  /etc/rc2.d  /etc/rc3.d  /etc/rc4.d  /etc/rc5.d  /etc/rc6.d

上面目录名中的”rc”,表示run command(运行程序),最后的d表示它们都是daemon(守护进程)。让我们看看 /etc/rc2.d 目录中到底指定了哪些程序。

  $ ls  /etc/rc2.d    README  S01motd  S13rpcbind  S14nfs-common  S16binfmt-support  S16rsyslog  S16sudo  S17apache2  S18acpid  …

可以看到,除了第一个文件README以外,其他文件都是”字母S+两位数字+程序名”的形式。字母S表示Start,也就是启动的意思(启动脚本 的运行参数为start),如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为 stop)。后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbing、nfs……数字相同时,则 按照程序名的字母顺序启动。

所有这件文件都是链接文件,指向目录 /etc/init.d 中对应的启动脚本文件。如果想增加或删除某些开机启动程序,不建议手动修改这些链接文件,而是用一些专门命令进行管理(参考这里这里)。

第五步、用户登录

开机启动程序加载完毕以后,就要让用户登录了。

Linux:Linux 的启动流程
Linux:Linux 的启动流程

一般来说,用户的登录方式有三种:

  (1)命令行登录

  (2)ssh登录

  (3)图形界面登录

这三种情况,都有自己的方式对用户进行认证。

(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc /pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。

(2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。

(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

第六步、进入 login shell

所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。

Linux:Linux 的启动流程
Linux:Linux 的启动流程

Debian默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。

(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。

  ~/.bash_profile  ~/.bash_login  ~/.profile

需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

(2)ssh登录:与第一种情况完全相同。

(3)图形界面登录:只加载 /etc/prfile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

第七步,打开 non-login shell

老实说,上一步完成以后,Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了内容的完整,必须再介绍一下这一步。

用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件。

Linux:Linux 的启动流程
Linux:Linux 的启动流程

non-login shell的重要性,不仅在于它是用户最常接触的那个shell,还在于它会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。

你也许会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,因此bash 也就不能完成定制了?事实上,Debian已经考虑到这个问题了,请打开文件 ~/.profile,可以看到下面的代码:

  if [ -n “$BASH_VERSION” ]; then    if [ -f “$HOME/.bashrc” ]; then      . “$HOME/.bashrc”    fi  fi

上面代码先判断变量 $BASH_VERSION 是否有值,然后判断主目录下是否存在 .bashrc 文件,如果存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成”source ~/.bashrc”也是可以的。

因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种情况提到过,如果存在~ /.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就行 了。

  if [ -f ~/.profile ]; then    . ~/.profile  fi

这样一来,不管是哪种情况,.bashrc都会执行,用户的设置可以放心地都写入这个文件了。

Bash的设置之所以如此繁琐,是由于历史原因造成的。早期的时候,计算机运行速度很慢,载入配置文件需要很长时间,Bash的作者只好把配置文件 分成了几个部分,阶段性载入。系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc。

顺便提一下,除了Linux以外, Mac OS X 使用的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile里面调用.bashrc。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。

参考链接

[1] Debian Wiki, Environment Variables

[2] Debian Wiki, Dot Files

[3] Debian Administration, An introduction to run-levels

[4] Debian Admin,Debian and Ubuntu Linux Run Levels

[5] Linux Information Project (LINFO), Runlevel Definition

[6] LinuxQuestions.org, What are run levels?

[7] Dalton Hubble, Bash Configurations Demystified

(完)

作者:阮一峰

日期:2013年8月17日

来自:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html

 已同步至 linux的微博

Linux:Linux流量监控工具 – iftop

一直都是使用 nethogs 监控网站的流量,想换一下试试其他软件,所以找到了 iftop,这是一款不错的流量监控软件,在 Ubuntu 上安装也很方便。

Linux:Linux流量监控工具 – iftop
Linux:Linux流量监控工具 – iftop

安装和运行

打开终端,直接在终端输入以下命令:

sudo apt-get install iftop

使用也很简单,直接输入命令:

sudo iftop

如果你有多个网卡,可以指定网卡:

sudo iftop -i eth1

官方网站:http://www.ex-parrot.com/~pdw/iftop/

iftop相关参数

常用的参数

-i 设定监测的网卡,如:# iftop -i eth1

-B 以bytes为单位显示流量(默认是bits),如:# iftop -B

-n 使host信息默认直接都显示IP,如:# iftop -n

-N 使端口信息默认直接都显示端口号,如: # iftop -N

-F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0

-h 帮助,显示参数信息

-p 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;

-b 使流量图形条默认就显示;

-f 过滤计算包用的;

-P 使host信息及端口信息默认就都显示;

-m 设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M

进入iftop画面后的一些操作命令(注意大小写)

按 h 切换是否显示帮助;

按 n 切换显示本机的IP或主机名;

按 s 切换是否显示本机的host信息;

按 d 切换是否显示远端目标主机的host信息;

按 t 切换显示格式为2行/1行/只显示发送流量/只显示接收流量;

按 N 切换显示端口号或端口服务名称;

按 S 切换是否显示本机的端口信息;

按 D 切换是否显示远端目标主机的端口信息;

按 p 切换是否显示端口信息;

按 P 切换暂停/继续显示;

按 b 切换是否显示平均流量图形条;

按 B 切换计算2秒或10秒或40秒内的平均流量;

按 T 切换是否显示每个连接的总流量;

按 l 打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;

按 L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;

按 j 或按 k 可以向上或向下滚动屏幕显示的连接记录;

按 1 或 2 或 3 可以根据右侧显示的三列流量数据进行排序;

按 < 根据左边的本机名或IP排序; 按 > 根据远端目标主机的主机名或IP排序;

按 o 切换是否固定只显示当前的连接;

按 f 可以编辑过滤代码;

按 ! 可以使用shell命令;

按 q 退出监控。

转载自IMCN

Linux:Linux下chkconfig命令详解

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

使用语法:

chkconfig [–add][–del][–list][系统服务] 或 chkconfig [–level <等级代号>][系统服务][on/off/reset]

chkconfig在没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回true,否则返回false。如果在服务名后面指定了on,off或者reset,那么chkconfi 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。

参数用法:

–add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。–del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。–level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕。

等级0表示:关机等级1表示:单用户模式等级2表示:无网络连接的多用户命令行模式等级3表示:有网络连接的多用户命令行模式等级4表示:保留,未使用等级5表示:带图形界面的多用户模式等级6表示:重新启动

对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。

chkconfig –list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。

chkconfig –add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。

chkconfig –del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。

chkconfig [–level levels] name:设置某一服务在指定的运行级是被启动,停止还是重置。

运行级文件:

每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 – 代替运行级。第二行对服务进行描述,可以用 跨行注释。

例如,random.init包含三行:

# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for
# higher quality random number generation.

使用范例:

chkconfig –list #列出所有的系统服务

chkconfig –add httpd #增加httpd服务

chkconfig –del httpd #删除httpd服务

chkconfig –level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态

chkconfig –list #列出系统所有的服务启动情况

chkconfig –list mysqld #列出mysqld服务设置情况

chkconfig –level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,–level 35表示操作只在等级3和5执行,on表示启动,off表示关闭

chkconfig mysqld on #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级

如何增加一个服务:

1.服务脚本必须存放在/etc/ini.d/目录下;

2.chkconfig –add servicename

  在chkconfig服务列表中按照默认配置增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;

3.chkconfig –level 35 mysqld on

  修改服务的默认启动等级。

 

via http://www.linuxde.net/2013/08/15135.html 

Linux:ClassicMenu Indicator 0.08 发布

ClassicMenu Indicator 是一个很方便使用的程序菜单列表工具。简单的说就是一个开始菜单程序。可以设置在 Unity panel 上。使用的时候,只需要一个点击,就可以找到你需要使用的各个程序。

ClassicMenu Indicator 已经更新到 0.08 版,对前面的版本进行了优化,同时支持更多的 Ubuntu 不同版本。

Linux:ClassicMenu Indicator 0.08 发布
Linux:ClassicMenu Indicator 0.08 发布

我们可以通过 PPA 很简单的来安装它,支持 Ubuntu 12.04, Ubuntu 12.10, Ubuntu 13.04, Ubuntu 13.10 。命令如下:

sudo add-apt-repository ppa:diesch/testingsudo apt-get updatesudo apt-get install classicmenu-indicator

安装完毕后可以通过 Dash 中搜索 ClassicMenu 来运行它。

 已同步至 linux的微博

来源:https://linux.cn/article-1850-1.html

Linux:Android手机的12非典型用途

苹果、微软和谷歌三大平台厂商对待手机操作系统的态度完全不同,iOS和Windows Phone以安全为由限制用户和开发者接触系统核心,让用户丧失了很多定制的乐趣,不过开源的Android显然能让你做更多事情。大多数用户都知道,你 可以“Root”Android设备,通过第三方固件来改变手机界面甚至是功能。事实上,Android手机远远比你想象的更加强大,以下便是12项会令人惊讶的额外功能:

1. 充当Web服务器

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

Android是基于Linux开发的系统,所以它可以使用MySQL数据库标准运行完整的Web服务器功能,便毫不奇怪了。服务器而已支持PHP和FTP传输,你甚至可以将其放到互联网上。对于开发人员来说,可以使用这项功能来测试代码,然后为客户演示,或者是作为自己博客的服务器使用。除了手机,你还可以将低价的Android迷你电脑作为廉价服务器使用。

2. 编写Android应用

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

如果你想为iPhone编写应用程序,可能需要选择一款Mac电脑;如果是Windows Phone或是黑莓,则需要一款PC。Android的强大之处在于,你完全可以使用Android设备来编写应用,比如使用AIDE软件。除此之外,还可以使用DroidEdit等应用来编写HTML、PHP、avaScript和其他Web代码。

3. 从电脑远程访问Android手机

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

只要安装类似2X或Splashtop的远程桌面软件,就可以通过手机来远程访问PC内容;同理,也可以使用计算机来访问Android手机。

4. 充当计步器

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

在今年早些时候发布的三星Galaxy S4中,我们已经看到了相关的计步器功能。事实上,该机并没有内置什么特殊的硬件,几乎所有的Android手机都可以作为一个计步器使用。下载一个类似Accupedo的计步器应用,就可以通过手机内置的重力感应器实现计步功能,十分方便。

5. 充当安全摄像头

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

如果你已经升级了最先进的四核智能手机,那么老旧的单核Android手机怎么处理呢?不妨将其作为一款安全摄像头使用,之前我们也有相关介绍,只要在手机中安装相应的软件并连接到互联网上,就可以通过另一款设备在任何地方远程监控了。

6. 连接U盘或闪存卡

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

基本上每一款Android手机都内置了一个micro-USB接口,即使它不支持USB OTG功能,也可以通过一个USB OTG连接线来实现更方便的数据传输功能,当然也需要获得完全的系统权限。使用这根OTG数据线,可以在手机上连接U盘、读卡器,然后通过资源管理器软件访问,十分方便,你甚至可以将手机作为一个数码相机伴侣使用。

7. 连接鼠标和键盘

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

同样的,USB OTG功能可以让你在Android手机上使用键盘或是鼠标,如果需要两者同时实现,则还需要一个USB HUB。

8. 降低电压延长电池寿命

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

除了使用省电模式,你还可以降低Android手机的电压(调节处理器频率及电压),来实现更长的电池寿命。在进行这一操作之后,三星Galaxy Note 2能够获得12小时53分钟的使用时间,之前则为10小时46分钟。

9. 充当PC的无线鼠标或触摸板

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

是的,如果你在使用笔记本电脑,但又忘带鼠标的话,手边的Android手机就可以变成一个鼠标或是触摸板了,此类应用很多,一些甚至还能实现多点缩放的操作效果。

10. 显示开始菜单和任务栏

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

你是一个忠实的Windows爱好者?没问题,纵使微软已经在自家的Windows 8系统中取消了经典的开始菜单,你却可以将它搬到Android手机上。“Taskbar”软件可以为你的Android手机带来类似Windows 7的界面效果,“开始”菜单能够显示最近打开的程序,屏幕下方的任务栏则更加好用,可以在界面底部显示已经打开的应用,切换起来更方便。

11. 收听收音机

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

也许你的昂贵的Android手机并没有内置FM收音机功能,不过不要紧,只需通过安装相应的应用,就能够收听到现场直播或是路况信息。

12. 安装Linux桌面

Linux:Android手机的12非典型用途
Linux:Android手机的12非典型用途

除了Windows风格的主题,你还可以直接运行Linux桌面系统,如Ubuntu或Debian。只要你的手机性能足够强大,便可以流畅使用它们,同时运行GIMP和OpenOffice等桌面软件,并连接键盘和鼠标,获得类似上网本的使用体验。

Linux:Google开源基于Deep Learning的word2vec工具

摘要:谷歌已经使用Deep Learning技术开发了许多新方法来解析语言,目前,谷歌开源了一款基于Deep Learning的学习工具——word2vec,这是首款面向大众的Deep Learning学习工具。

word2vec(word to vector)顾名思义,这是一个将单词转换成向量形式的工具。通过转换,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。

word2vec为计算向量词提供了一种有效的连续词袋(bag-of-words)和skip-gram架构实现,word2vec遵循Apache License 2.0开源协议。

如何转换?

word2vec主要是将文本语料库转换成词向量。它会先从训练文本数据中构建一个词汇,然后获取向量表示词,由此产生的词向量可以作为某项功能用在许多自然语言处理和机器学习应用中。

在举例子之前,引入余弦距离(Cosine distance)这个概念(摘自维基百科):

通过测量两个向量内积空间的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。在比较过程中,向量的规模大小不予考虑,仅仅考虑到向量的指向方向。余弦相似度通常用于两个向量的夹角小于90°之内,因此余弦相似度的值为0到1之间。

然后可以通过distance工具根据转换后的向量计算出余弦距离,来表示向量(词语)的相似度。例如,你输入“france”,distance工具会计算并显示与“france”距离最相近的词,如下:

              Word             Cosine distance
      -------------------------------------------
                spain              0.678515
              belgium              0.665923
          netherlands              0.652428
                italy              0.633130
          switzerland              0.622323
           luxembourg              0.610033
             portugal              0.577154
               russia              0.571507
              germany              0.563291
            catalonia              0.534176

在word2vec中主要有两种学习算法:连续词袋和连续skip-gram,switch-cbow允许用户选择学习算法。这两种算法有助于预测其它句子的词汇。

从词转换到句子或更长的文本

在一些特定的应用程序中,它还可以用于多个词汇,例如,“san francisco”,这样它就会通过预先处理数据集,让其形成句子,找到与“san francisco”余弦距离最近的内容:

              Word          Cosine distance
-------------------------------------------
          los_angeles              0.666175
          golden_gate              0.571522
              oakland              0.557521
           california              0.554623
            san_diego              0.534939
             pasadena              0.519115
              seattle              0.512098
                taiko              0.507570
              houston              0.499762
     chicago_illinois              0.491598

如何衡量词向量质量 

可能影响到词向量质量的几个因素:

  • 训练数据的数量和质量
  • 向量的大小
  • 训练算法

向量的质量对任何一个应用程序都非常重要,然而,根据复杂的任务来探索不同的超参数设置可能会过于苛刻。因此,我们设计了简单的测试集,来快速评估矢量词的质量。

词聚类(Word clustering)

词向量也可以从巨大的数据集中导出词类,通过执行词向量顶部的K-means聚类即可实现,脚本演示地址:./demo-classes.sh,最后输出的是一个词汇表文件和与之对应的类ID标识,例如: 

carnivores 234
carnivorous 234
cetaceans 234
cormorant 234
coyotes 234
crocodile 234
crocodiles 234
crustaceans 234
cultivated 234
danios 234
.
.
.
acceptance 412
argue 412
argues 412
arguing 412
argument 412
arguments 412
belief 412
believe 412
challenge 412
claim 412

性能

在多核CPU上(使用开关‘-threads N’),通过使用并行训练可以显著提高训练速度,超参数选择对性能也至关重要(包括速度和准确率),主要选择有:

  • 架构:skip-gram(慢、对罕见字有利)vs CBOW(快)
  • 训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
  • 欠采样频繁词:可以提高结果的准确性和速度(适用范围1e-3到1e-5)
  • 维度词向量:通常情况下表现都很好
  • 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近

去哪里收集训练数据

随着训练数据的增加,词向量质量也显著提升,如果以研究为目的的,可以考虑线上数据集: 

快速入门

  1. 代码下载:http://word2vec.googlecode.com/svn/trunk/
  2. 运行“make”编译word2vec工具
  3. 运行demo脚本:./demo-word.sh and ./demo-phrases.sh

关于word2vec更多介绍,大家可以阅读:https://code.google.com/p/word2vec/ 

via http://www.csdn.net/article/2013-08-20/2816643-word2vec 

Linux:海量数据相似度计算之simhash和海明距离

通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相似度、最长公共子串、编辑距离等。这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重。最简单的做法是拿着待比较的文本和数据库中所有的文本比较一遍如果是重复的数据就标示为重复。看起来很简单,我们来做个测试,就拿最简单的两个数据使用Apache提供的 Levenshtein for 循环100w次计算这两个数据的相似度。代码结果如下:

String s1 = "你妈妈喊你回家吃饭哦,回家罗回家罗" ;
String s2 = "你妈妈叫你回家吃饭啦,回家罗回家罗" ;
long t1 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
    int dis = StringUtils .getLevenshteinDistance(s1, s2);
}
long t2 = System.currentTimeMillis();
System. out .println(" 耗费时间: " + (t2 - t1) + "  ms ");

耗费时间: 4266 ms

大跌眼镜,居然计算耗费4秒。假设我们一天需要比较100w次,光是比较100w次的数据是否重复就需要4s,就算4s一个文档,单线程一分钟才处理15个文档,一个小时才900个,一天也才21600个文档,这个数字和一天100w相差甚远,需要多少机器和资源才能解决。

为此我们需要一种应对于海量数据场景的去重方案,经过研究发现有种叫 local sensitive hash 局部敏感哈希 的东西,据说这玩意可以把文档降维到hash数字,数字两两计算运算量要小很多。查找很多文档后看到google对于网页去重使用的是simhash,他们每天需要处理的文档在亿级别,大大超过了我们现在文档的水平。既然老大哥也有类似的应用,我们也赶紧尝试下。simhash是由 Charikar 在2002年提出来的,参考 《Similarity estimation techniques from rounding algorithms》 。 介绍下这个算法主要原理,为了便于理解尽量不使用数学公式,分为这几步:

  • 1、分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

  • 2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。

  • 3、加权,通过 2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。

  • 4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

  • 5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

整个过程图为:

Linux:海量数据相似度计算之simhash和海明距离
Linux:海量数据相似度计算之simhash和海明距离

大家可能会有疑问,经过这么多步骤搞这么麻烦,不就是为了得到个 0 1 字符串吗?我直接把这个文本作为字符串输入,用hash函数生成 0 1 值更简单。其实不是这样的,传统hash函数解决的是生成唯一值,比如 md5、hashmap等。md5是用于生成唯一签名串,只要稍微多加一个字符md5的两个数字看起来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数据结构。不过我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hashcode也是用于这个目的。看到这里估计大家就明白了,我们使用的simhash就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hashcode却不行。我们可以来做个测试,两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。

通过simhash计算结果为:

1000010010101101111111100000101011010001001111100001001011001011

1000010010101101011111100000101011010001001111100001101010001011

通过 hashcode计算为:

1111111111111111111111111111111110001000001100110100111011011110

1010010001111111110010110011101

大家可以看得出来,相似的文本只有部分 01 串变化了,而普通的hashcode却不能做到,这个就是局部敏感哈希的魅力。目前Broder提出的shingling算法和Charikar的simhash算法应该算是业界公认比较好的算法。在simhash的发明人Charikar的论文中并没有给出具体的simhash算法和证明,“量子图灵”得出的证明simhash是由随机超平面hash算法演变而来的

现在通过这样的转换,我们把库里的文本都转换为simhash 代码,并转换为long类型存储,空间大大减少。现在我们虽然解决了空间,但是如何计算两个simhash的相似度呢?难道是比较两个simhash的01有多少个不同吗?对的,其实也就是这样,我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。

为了高效比较,我们预先加载了库里存在文本并转换为simhash code 存储在内存空间。来一条文本先转换为 simhash code,然后和内存里的simhash code 进行比较,测试100w次计算在100ms。速度大大提升。

未完待续:

1、目前速度提升了但是数据是不断增量的,如果未来数据发展到一个小时100w,按现在一次100ms,一个线程处理一秒钟 10次,一分钟 60 * 10 次,一个小时 60*10 *60 次 = 36000次,一天 60*10*60*24 = 864000次。 我们目标是一天100w次,通过增加两个线程就可以完成。但是如果要一个小时100w次呢?则需要增加30个线程和相应的硬件资源保证速度能够达到,这样成本也上去了。能否有更好的办法,提高我们比较的效率?

2、通过大量测试,simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。但是如果我们处理的是微博信息,最多也就140个字,使用simhash的效果并不那么理想。看如下图,在距离为3时是一个比较折中的点,在距离为10时效果已经很差了,不过我们测试短文本很多看起来相似的距离确实为10。如果使用距离为3,短文本大量重复信息不会被过滤,如果使用距离为10,长文本的错误率也非常高,如何解决?

Linux:海量数据相似度计算之simhash和海明距离
Linux:海量数据相似度计算之simhash和海明距离

参考:Detecting near-duplicates for web crawling.

Similarity estimation techniques from rounding algorithms.

http://en.wikipedia.org/wiki/Locality_sensitive_hashing

http://en.wikipedia.org/wiki/Hamming_distance

simHash 简介以及 java 实现

simhash原理推导

 

Linux:设计师的 Linux 桌面发行版 elementary OS

很少关注桌面方面的事情,上次玩了一下 CrunchBang Linux 后又点燃了对 Linux 各种版本的好奇。今天介绍的是 elementary OS,号称 “最美的 Linux”. Elementary 最早是 Ubuntu 的一个美化项目,现在成了一个独立的 Linux 桌面发行版 elementary OS(基于 Ubuntu)。

安装完 elementary OS 后登陆界面不错,进去后感觉也挺好,要说 “最美” 可能有人有不同的看法,不过的确是精心设计过的。有点不习惯的是,elementary OS 在默认软件选择上有点非主流,浏览器用的是 Midori,邮件程序用的是 Geary Mail,Terminal 用的是 Pantheon Terminal,文本编辑器用的是 Scratch,音乐播放器使用的是 noise,文件管理器是 Pantheon Files,猜测项目的作者选择这些软件是为了更好的和发行版的风格兼容。貌似自带的大部分软件都是自家写的,比如 Pantheon Terminal, Pantheon Files, noise, Scratch 等就是 elementary Apps team 维护的。

elementary OS 默认桌面:

Linux:设计师的 Linux 桌面发行版 elementary OS
Linux:设计师的 Linux 桌面发行版 elementary OS

 

浏览器和 Terminal:

Linux:设计师的 Linux 桌面发行版 elementary OS
Linux:设计师的 Linux 桌面发行版 elementary OS

 

虽然 elementary OS 的默认软件有点非主流,不过可以很容易通过它自带的 Software Center 安装自己喜欢的软件,当然也可以 apt-get install,甚至连 elementary OS 的源(/etc/apt/sources.list)都是直接用的是 ubuntu 的,更像是一个 Ubuntu 衍生版:

Linux:设计师的 Linux 桌面发行版 elementary OS
Linux:设计师的 Linux 桌面发行版 elementary OS

 

默认带的中文字体发虚,安装一个中文字体:

$ sudo apt-get update$ sudo apt-get install ttf-wqy-microhei

想安装更多好看的主题的话参考 5 New Awesome Elementary Themes,先安装用来切换主题调整界面的工具 elementary-tweaks,再安装主题本身 elementary-blue-theme:

$ sudo add-apt-repository ppa:versable/elementary-update$ sudo apt-get update$ sudo apt-get install elementary-tweaks$ sudo apt-get install elementary-blue-theme

简单的说,可以把 elementary OS 看成一个简化的、美化的、符合部分人喜好的 Ubuntu,简单归简单,貌似 elementary OS 的目标一点都不简单,为了统一风格、用户体验和精益求精,不惜重复造轮子采用 Vala 语言重新开发一些常用应用软件,有别于那种用第三方软件拼凑起来的发行版,不知道这种模式能坚持多久,这里做个记号,重点关注一下。

 

via http://www.vpsee.com/2013/08/introduction-to-elementaryos/ 

Linux:Square 技术团队的开源其 Vim 配置文件

Square 的工程师在使用很多种代码编辑器:Sublime、IntelliJ、Xcode 和 Vim。其中 Vim 是使用最多的,随着时间推移,在 Square 的 Vim 粉丝把配置、快捷方式和插件汇编成一个单独的仓库,我们亲切地称为 Maximum Awesome,并把它开源了。我们希望其他在用 OS X 的朋友能够在几分钟之内就能用上 Vim。

Linux:Square 技术团队的开源其 Vim 配置文件
Linux:Square 技术团队的开源其 Vim 配置文件
Maximum Awesome 配备了很多完整 IDE 有的特性:语法高亮、代码补全、错误高亮等等。下面这些是我喜欢的快捷方式和插件:

  • 共享剪贴板:Vim中的寄存器(register,作用和Windows中的剪贴板类似)和 OS X 剪贴板同步,可以像在本地应用中移动代码。
  • Command-T 插件:对于那些用Sublime或TextMate的朋友来说,这个已经很熟悉了。不过在Vim中,使用快捷方式 ,t ,后面加你想打开的文件名。
  • NERDTree 插件:浏览项目的文件结构、移动文件或创建新文件,想做这些操作,都不要离开舒适的Vim啦。使用 ,d 打开 drawer,或使用 ,f 来给当前文件开启NERDTree。
  • 集成 Git:这个插件包括了大多数的 git 命令,但是我最喜欢的是 :Gblame 和 :Gdiff。用:Gblame 可知道谁写某个文件的不同部分,用 :Gdiff ,可以在两个侧栏中对比我刚才写的内容
  • 快速注释代码:用 \ 可快速注释某一行代码,或者用 \ 注释选中的代码

 

当然了,这里还有些不是 Vim 的组件了。Maximum Awesome 搭配了iTerm 2、一个  tmux 配置文件,还有 Solarized color scheme.。详细内容,请 Vim 爱好者移步:https://github.com/square/maximum-awesome

 (译自知名移动支付公司Square官博8月28日的文章)

注:截至 2013-8-30 10:23:19 ,这个项目在 Github 已有 702 个 star。

原文链接: Riley Strong   翻译: 伯乐在线 – 黄利民译文链接: http://blog.jobbole.com/46966/

 

Linux:移动网站性能优化:网页加载技术概览

性能一直是网站成功的关键。越来越多的研究已经证明,不管是小型电商,还是像沃尔玛那样的连锁店,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的广告收入,更多的用户粘性和更多的客户满意度。

在过去几年,Web开发者都是基于改善硬件或者提高带宽速度来优化用户体验。但是最近几年,爆炸式的移动Web浏览器的使用打破了这个途径。低带宽,高延迟,小内存,低处理器性能的移动设备环境,迫使开发者不得不想办法通过优化前端页面的性能来满足用户的性能预期。

在强调如何解决移动端性能问题上,这篇文章总结了一些前端优化的案例,并且概括了一些加速页面的方法和策略。

 

为什么性能会影响这么多

不论你的页面设计地多么有趣、漂亮、交互性好,不管是在桌面还是移动设备上,如果页面需要花2到3秒时间去渲染展示,那么用户都会很快变得不耐烦的。可以预期的是,在页面还在加载的时候,用户很有可能从浏览购买的行为转变为点击回退键或者是关闭浏览器的行为。

不到1秒钟的延迟甚至也会显著地影响收入。在2006年,当时还在Google工作的Marissa Mayer说,由于用户表示希望在一个搜索页上看到多于10个搜索结果,Google就实验性地修改为30个。但是让人吃惊的是,在这个实验里,流量和投资都减少了20个百分点,显然是由于更多的搜索结果导致多花费了半秒时间来加载页面。^5

用户的期望总是在不断的提升。2009年,Forrester研究所的Akamai的一项研究发现表明,网页响应时间可容忍的阀值是2秒,一旦网页相应时间超过3秒,会有40%的用户放弃浏览页面。一年之后,Akamai的另一项研究表明,超过3秒放弃浏览页面的用户比例上升到了57%。^1,7

此外,移动端的用户希望移动设备上的页面性能不亚于桌面PC。由Tealeaf科技(现在已经并入IBM)委托的“Harris的互动2011移动交互调查”显示,在前一年有过移动消费经历的成年人中,有85%希望移动设备上的体验能与手提电脑或者PC上的体验相当,甚至于更好。并且有63%的人表示,一旦他在移动设备上的交易遇到了一个问题,他们就不会再想通过其他渠道去购买这个公司的其他产品了。^10换句话说,差劲的移动页面性能会影响到公司其他各种平台的销售,这其中当然也包括线下的实体店。

移动流量正在迅速增长。对许多消费者而言,他们的手机或者平板设备已经成为他们浏览网络的主要入口了,但是其性能表现却差强人意。2011年2月,Compuware公司委托Equation 研究所做的一项研究表明,几乎一半的移动用户(46%)表示他们手机上的网站加载速度过慢。60%的用户希望页面能在3秒或者更少的时间内加载完成,74%的用户表示,当单个页面加载时间花费5秒或者更多的时候,他们会选择离开这个页面。在2012年,由Strangeloop网络(现已并入Redware)发起的一项针对200家领先的电子商务网站研究表明,3G网络环境下,平均加载时间为11.8秒(图1),而在LTE(4G)环境下,加载时间只有轻微的改善,为8.5秒。^8

Linux:移动网站性能优化:网页加载技术概览
Linux:移动网站性能优化:网页加载技术概览

 

移动设备表现性能的三种影响因素

正如上文所说的,移动设备天生有下面三种性能限制:带宽低,内存小,处理器性能低。这些性能挑战又加上一些其他的问题,例如:

网页比以前更大。根据HTTP Archive网站的分析,现在平均的一个web页面需要加载超过1MB的数据,其中包含有图片,Javascript,CSS(Cascading Style Sheets)等。更大的网页会影响桌面PC的显示性能。对于移动端的性能 — 特别是3G环境下的性能 — 影响更严重。这个影响会在今后的三年更加明显。以现在的页面增长速度来说,到2015年,平均的页面大小会达到2MB。

延迟相差巨大。对LTE来说,延迟大概有34ms,对3G来说,延迟大概有350毫秒甚至更多。移动端的延迟性唯一不变的就是延迟时间永远是不定的,即使是在同一个地点,每次的延迟都是不定的。这是由于大量的数据是通过信息塔进行传输的。因此诸如天气,甚至是持有者所面向的方向都有可能成为影响因素。

下载速度相差巨大。下载速度的范围从3G环境下的1Mbps到LTE环境下的31Mbps。把这个和美国平均的带宽15Mbps相比是一个很有意思的事情,3G环境比平均带宽慢了15倍,而LTE却能达到平均带宽的2倍那么快。

 

M.SITES并不能完全解决移动端性能的问题。

许多网站建设者尝试针对多用户访问,大网页和低流量连接的访问页面,开发出短小,快速,精简的m.sites;但是,这些尝试并没有什么用,当用户有选择权的时候,高达35%的移动用户会选择浏览完整的网站。

这些选择浏览完整网站的用户显然比浏览m.sites的用户更有购买欲望。一个研究表明,移动端每$7.00的消费中,有$5.50是来自于网站的网站浏览,只有$1.00是来自于m.sites,剩下的$0.50则是来自于客户端。^9

 

解决问题

改善网站性能的主要策略并没有因为从PC变成手机或者平板设备而有变化,只是会参杂一些小的策略。

不论在PC还是在移动浏览器上,页面展示需要的时间里,只有20%是用来读取页面的HTML的。剩下的80%是用来加载额外的像样式表、脚本文件、或者图片这样的资源和执行客户端的程序。

三个主要的改善性能的策略是:

  • 减少每个页面需要获取额外资源的HTTP请求数
  • 减少每个请求加载的大小
  • 优化客户端执行的优先级和脚本执行的效率

 

由于移动网络通常比桌面机器的网络慢,所以减少请求数和请求加载量是非常重要的。由于移动端的浏览器解析HTML和执行JavaScript的效率比桌面PC低,所以优化客户端程序也是非常关键的。另外,移动端浏览器的缓存大小比桌面PC低,所以需要有方法能重复利用本地的缓存资源。

文章剩余部分总结了能解决这些问题的方法。虽然这些方法大都可以自动化解决,当然也可以由有经验的前端工程师来手动解决。关键就是要知道人工解决这些技术的方法如何控制资源的请求。通常在CMS(内容管理系统)或者其他Web应用中,有些页面包含一些自动生成好的或者离线的HTML片段、CSS或者Javascript文件,这样的页面开发者就不需要去优化它们了。

 

减少请求

最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源。这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。CDNs(内容分发网络)把资源放在离用户地理位置更近的地方对解决这个问题能起到很大作用,但是比起获取请求,大量的请求对页面加载时间的影响更为严重。而且最近的发现表明,CDNs对移动端用户的性能影响越来越低。

下面的章节讨论了简化HTTP请求的几种方法。

 

整合资源

对开发者来说,将Javascript代码和CSS样式放到公共的文件中供多个页面共享是一种标准的优化方法。这个方法能很简单的维护代码,并且提高客户端缓存的使用效率。

在Javascript文件中,要确保在一个页面中相同的脚本不会被加载多次。当大团队或者多个团队合作开发的时候,这种冗余的脚本就很容易出现。你可能会对它的发生频率并不低感到非常吃惊。

Sprites是css中处理图片的一项技术。Sprites就是将多张图片整合到一个线性的网状的大图片中。页面就可以将这个大图片一次性获取回来并且做为css的背景图,然后使用css的背景定位属性展示页面需要的图片部分。这种技术将多个请求整合成一个,能显著地改善性能。

实现小贴士:平稳地改进但是需要对资源有控制权限。根据开发者的网站不同权限,一些资源并不需要被整合起来(例如,一些由CMS生成的资源)。还有,对于一些外部域引用的资源,强行整合可能会导致问题。需要注意的是,整合资源对手机浏览器来说是一把双刃剑。整合资源确实会在首次访问减少请求,但是大的资源文件可能会导致缓存失效,所以,需要小心地使用各种技术整合资源,以达到优化本地存储的目的。

 

使用浏览器缓存和本地缓存

现在所有的浏览器都会使用本地资源去缓存住那些被Cache-Control或者Expires头标记的资源,这些头能标记资源需要缓存的时间。另外,ETag(实体标签)和Last-Modified头来标识当资源过期后是否需要重新请求。浏览器为了减少不必要的服务器请求,尽可能地从本地缓存中获取资源,并且将那些已经过期的、或者当缓存空间减小的时候将那些很久不用的资源进行清理。浏览器缓存通常包括图片,CSS,Javascript代码,这些缓存能合理地提高网站的性能。(比如为了支持后退和前进的按钮,使用一个单独的缓存来保存整个渲染的页面)。

移动浏览器缓存,通常是比桌面PC小的多,这就导致了缓存的数据会很经常被清理。HTML5的缓存基于浏览器缓存提供了一个很好的替换方案。Javascript的localStorage已经在所有主流的桌面和移动端浏览器上都实现了。使用脚本代码能简便地支持HTML5的localStorage操作,可以读写键值数据,每个域名大概有5MB的容量。虽然不同的移动浏览器上读写速度相差很大,但是localStorage大容量的缓存使得它很适合作为客户端的缓存。从localStorage获取资源明显快于从服务器上获取资源,而且在大多数移动设备上也比依靠缓存头或者浏览器的本地缓存更灵活可靠。这是移动浏览器比桌面PC更有优势的一个地方,在桌面PC上,本地缓存仍然优先使用标准的浏览器缓存,导致桌面PC本地缓存的性能落后于移动浏览器。

实现小贴士:需要进一步考虑。虽然localStorage的机制易于实现,但是它的一些控制机制却是非常复杂的。你需要考虑到缓存带给你的所有问题,比如缓存失效(什么时候需要删除缓存?),缓存丢失(当你希望数据在缓存中的时候它并不在怎么办?),还有当缓存满的时候你怎么办?

 

首次使用的时候在HTML中嵌入资源

HTML的标准是使用链接来加载外部资源。这使得更容易在服务器上(或者在CDN上)操作更新这些资源,而不是在每个页面上修改更新这些资源。根据上文讨论的,这种模式也使得浏览器能从本地缓存而不是服务器上获取资源。

但是对还没有缓存到浏览器localStorage的资源来说,这种模式对网站的性能有负面的影响。一般来说,一个页面需要几十个单独的请求来获取资源从而渲染页面。所以说,从性能的角度来说,如果一个资源没有很高的被缓存的几率的话,最好把它嵌入到页面的HTML中(叫inlining),而不是使用链接外部。脚本和样式是支持内嵌到HTML中的,但是图片和其他的二进制资源其实也是可以通过内嵌包含base64编码的文本来嵌入到HTML中的。

内嵌的缺点是页面的大小会变得非常大,所以对于Web应用来说,关键的是能够跟踪分析这个资源什么时候需要从服务端获取,什么时候已经缓存到客户端了。另外,在第一次请求资源后必须能够使用代码在客户端缓存资源,因此,在移动设备上,使用HTML5 localStorage能很好地做到内嵌。

实现小贴士:平稳处理。由于不知道用户是否已经访问过这个页面了,所以需要网站有机制能生成不同版本的页面。

 

使用HTML5服务端发送事件

Web应用已经使用了各种从服务器上轮询资源的方法来持续地更新页面。HTML5的EventSource对象和Server-Sent事件能通过浏览器端的JavaScript代码打开一个服务端连接客户端的单向通道。服务端可以使用这个写通道来发送数据,这样能节省了HTTP创建多个轮询请求的消耗。这种方式比HTML的WebSocket更高效。WebSocket的使用场景是,当有许多客户端和服务端的交互的时候(比如消息或者游戏),在全双工连接上建立一个双向通道。

实现小贴士:需要进一步考虑。这个技术是基于具体的技术实现的。如果你的网站当前是使用其他的Ajax或者Comet技术来轮询的,转变成Server-Sent 事件需要重构网站的Javascript代码。

 

消除重定向

当用户在一个移动设备上访问桌面PC网站的时候,Web网站应用通常读取HTTP的user-agent头来判断这个用户是否是来自移动设备的。然后应用会发送带有空HTTP body和重定向HTTP地址头的HTTP 301(或者302)请求,把用户重定向到网站的移动版本上去。但是,这个额外的客户端和服务端的交互通常在移动网络上会消耗几百毫秒。因此,在原先的请求上传递移动的web页会比传递一个重定向的信息并让客户端再请求移动页面更快。

对于那些想要在移动设备上看桌面PC网站的用户来说,你可以在移动web页面上提供一个链接入口,这样也能同时表示你的网站是并不提倡这种行为的。

实现小贴士:虽然这个技术在理论上是简单的,但是实际上并不易于实施。由于有些m.sites是宿主在其他地方的,所以许多网站会选择重定向到一个不同的服务器上。有的网站则是会在重定向请求的时候种植上Cookie告诉Web应用这个用户是在使用移动设备。这种方法可能对web应用来说更容易控制。

 

减少资源负载

大小问题。渲染小页面更快,获取小资源也更快。减小每个请求的大小通常不如减少页面请求个数那么显著地提高性能。但是,有些技术在性能方面,特别是在需要对带宽和处理器性能精打细算的移动设备环境下,仍然是能带来很大利益的。

 

压缩文本和图像

诸如gzip这样的压缩技术,依靠增加服务端压缩和浏览器解压的步骤,来减少资源的负载。但是,一般来说,这些操作都是被高度优化过了。而且测试表明,压缩对网站还是起到优化性能的作用的。那些基于文本的响应,包括HTML,XML,JSON(Javascript Object Notation),Javascript,和CSS可以减少大约70%的大小。

浏览器在Accept-Encoding请求头中申明它的解压缩技术,并且当它们接收到服务端返回的Content-Encoding响应头标示的时候,就会按照这个响应头自动做解压操作。

实现小贴士:易于实现。如果设置正确的话,现在所有的Web服务器都支持压缩响应。但是,也有一些桌面PC的安全工具会将请求头中的Accept-Encoding头去掉,这样即使浏览器支持解压缩,用户也无法获取到压缩后的响应。

 

代码简化

简化通常是使用在脚本和样式文件中,删除一些不必要的字符,比如空格,换行符,或者注释等。不需要暴露给外部的命名就可以被缩短为一个或者两个字符,比如变量名。合适的简化资源通常在客户端不需要做任何其他的处理,并且平均减少20%的资源大小。内嵌在HTML中的脚本和样式文件也是可以精简的。有很多很好的库来做精简化的操作,这些库一般也同时会提供合并多个文件这样减少请求数的服务。

简化带来的好处并不局限于减少带宽和延迟,对于那些移动设备上缓存无法保存的过大资源来说,也是很有改善的。Gzip在这个方面并没有任何帮助,因为资源是在被解压后才被缓存起来的。

实现小贴士:易于实现。Google的Closure Compiler已经难以置信地完成了理解和简化Javascript的工作。但是CSS的简化则没有那么容易,因为对不同浏览器来说有不同的CSS技术能迷惑CSS简化工具,然后让CSS简化后无法正常工作。必须要注意的是,已经有这样的案例了,即使只是删除了不必要的字符,简化工作也有可能破坏页面。所以当你应用简化技术之后,请做一下完整的功能测试工作。

 

调整图片大小

图片通常是占用了Web页面加载的大部分网络资源,也占用了页面缓存的主要空间。小屏幕的移动设备提供了通过调整图片大小来加速传输和渲染图片资源的机会。如果用户只是在小的移动浏览器窗口中看图片的话,高分辨率的图片就会浪费带宽、处理时间和缓存空间。

为了加速页面渲染速度和减少带宽及内存消耗,可以动态地调整图片大小或者将图片替换为移动设备专用的更小的版本。不要依靠浏览器来将高分辨率的图片转换成小尺寸的图片,这样会浪费带宽。

另外一个方法是先尽快加载一个低分辨率的图片来渲染页面,在onload或者用户已经开始和页面交互以后将这些低分辨率的图片替换成为高分辨率的图片。

实现小贴士:特别应用在高度动态化的网站是有优势的。

 

使用HTML5和CSS 3.0来简化页面

HTML5包括了一些新的结构元素,例如header,nav,article和footer。使用这些语义化的元素比传统的使用div和span标签能使得页面更简单和更容易解析。一个简单的页面更小加载更快,并且简单的DOM(Document Object Model)代表着更快的JavaScript执行效率。新的标签能很快地应用在包括移动端的新浏览器版本上,并且HTML5设计让那些不支持它的浏览器能平稳过渡使用新标签。

HTML5的一些表单元素提供了许多新属性来完成原本需要javascript来完成的功能。例如,新的placeholder属性用于显示在用户输入进入输入框之前显示的介绍性文字,autofocus属性用于标示哪个输入框应当被自动定位。

也有一些新的输入框元素能不用依靠Javascript就可以完成一些通用的需求。这些新的输入框类型包括像e-mail,URL,数字,范围,日期和时间这样需要复杂的用户交互和输入验证的元素。在移动浏览器上,当需要输入文本的时候,弹出的键盘通常是由特定的输入框类型来做选择的。不支持指定的输入类型的浏览器就会只显示一个文本框。

另外,只要浏览器支持内建的层次,圆角,阴影,动画,过渡和其他的图片效果,CSS 3.0就能帮助你创建轻便简易的页面了,而这些图片效果原先是需要加载图片才能完成的。这样,这些新特性就能加速页面渲染了。

有很多Web站点都提供哪些移动或者桌面浏览器支持哪项性能的更新说明。(例如:http://caniuse.com/ 和 mobilehtml5.org)。

实现小贴士:需要进一步考虑。人工地做这些改动是非常复杂和耗时的。如果你使用CMS,它可以帮你生成许多你不需要控制的HTML和CSS。

 

优化客户端的程序处理

浏览器按照什么顺序来执行代码生成一个页面,和页面复杂性及JavaScript的技术选择,都对性能有很大的影响。特别在客户端相对较慢的CPUs和少内存的移动端中尤为明显。下面的章节提供一些策略来提升页面处理的性能。

 

延迟渲染”BELOW-THE-FOLD”内容

可以确定的是如果我们将不可见区域的内容延迟加载,那么页面就会更快地展现在用户面前,这个区域叫做”below the fold”。为了减少页面加载后需要重新访问的内容,可以将图片替换为正确的高宽所标记的标签。

实现小贴士:平稳处理。一些好的Javascript库可以用来处理这些below-the-fold 延迟加载的图像。^12

 

延迟读取和执行的脚本

在一些移动设备上,解析Javascript代码的速度能达到100毫秒每千字节。许多脚本的库直到页面被渲染以后都是不需要的加载的。下载和解析这些脚本可以很安全地被推迟到onload事件之后来做。例如,一些需要用户交互的行为,比如托和拽,都不大可能在用户看到页面之前被调用。相同的逻辑也可以应用在脚本执行上面。尽量将脚本的执行延迟到onload事件之后,而不是在初始化页面中重要的可被用户看到的内容的时候执行。

这些延迟的脚本可能是你自己写的,更重要的是,也有可能是第三方的。对广告、社交媒体部件、或者分析的差劲的脚本优化会导致阻塞页面的渲染,会增加珍贵的加载时间。当然,你需要小心地评估诸如jquery这样为移动网站设计的大型脚本框架,特别当你仅仅只是使用这些框架中的一些对象的时候更要小心评估。

实现小贴士:平稳处理。许多第三方的框架现在提供延迟加载的异步版本的API。开发者只需要将原先的逻辑转化到这个异步版本。一些JavaScript要做延迟加载会有些复杂,因为在onload之后执行这些脚本需要注意很多注意事项。(例如,你有个脚本需要绑定到onload事件上,你需要做什么?如果你将脚本延迟到onload事件之后,就一定就会失去很多执行的时机。)

 

使用Ajax来增强进程

Ajax(Asynchronous JavaScript and XML)是一项使用XHR(XMLHttpRequest)对象来从Web服务器上获取数据的技术,它并不需要更新正在运行的页面。Ajax能更新页面上的某个部分而不需要重新构建整个页面。它通常用来提交用户的交互相应,但是也可以用来先加载页面的框架部分,然后当用户准备好浏览网页的时候再填充详细的内容。

尽管是这个名字,但是XMLHttpRequest并不强制要求你只能使用XML。你可以通过调用overrideMineType方法来制定”application/json”类型来使用json替换XML。使用JSON.parse会比使用原生的eval()函数快了几乎两倍,并且更为安全。

同时,切记Ajax的返回响应也会得益于那些应用在普通的返回响应的优化技术上面。确保对你的Ajax返回响应使用了缓存头,简化,gzip压缩,资源合并等技术。

实现小贴士:由于这个技术是根据具体应用不同而不同的,所以很难量化。或许由于跨域问题,你需要使用XHR2,这个技术能使用外部域的资源,从而能进行跨域的XHR请求。

 

根据网络状况进行适配处理

由于使用更多带宽会使用更多移动网络的费用,所以只有能检测网络的类型才能使用针对特定网络的优化技术。例如,预加载未来使用到的请求是非常聪明的做法,但是如果用户的带宽很稀有,并且加载的有些资源是永远不会用到的话,这个技术就是不合理的了。

在Android 2.2+,navigator.connection.type属性的返回值能让你区分Wifi和2G/3G/4G网络。在Blackberry上,blackberry.network也能提供相似的信息。另外,服务端通过检测请求中的User-Agent头或者其他的嵌入到请求中的信息能让你的应用检测到网络状况。

实现小贴士:需要进一步考虑。检测网络信息的API最近已经有所变化了。^11 接口现在不是直接定义Wi-Fi,3G等网络状况,而是给出了带宽信息和诸如“非常慢,慢,快和非常快”这样的建议。有个属性能给出估计的MB/s值和一个“meterd”的Boolean值来表示它的可信度,但是对浏览器来说,很难根据这个来判断环境。判断当前网络环境然后适配仍然是一种最好的方法,但是这种方法正在被考虑被替换。

 

对多线程来说尽量使用HTML5的WEB WORKER特性

HTML5中的Web Worker是使用多个线程并发执行Javascript程序。另外,这种特别的多线程实现能减少困惑开发者多年的,在其他平台上遇到的问题。例如,当一个线程需要改变一个正在被其他线程使用的资源该如何处理。在Web Worker中,子线程不能修改主用户界面(UI)线程使用的资源。

对提高移动站点的性能来说,Web Worker中的代码很适合用来预处理用户完成进一步操作所需要的资源的,特别是在用户的带宽资源不紧缺的情况下。在低处理器性能的移动设备上,过多的预加载可能会干扰当前页面的UI响应。使用多线程代码,让Web Worker对象(并且尽可能使用localStorage来缓存数据)在另外一个线程中操作预加载资源,这样就能不影响当前的UI表现了。

要特别说明的是,Web Worker只在Android 2.0以上的版本实现,而且iphone上的ios5之前的版本也不支持。在桌面PC上,总是落后的IE只在IE 10才支持Web Worker。

实现小贴士:平稳过渡。虽然这项技术并不是非常难实现,但是对Web Workers来说,有一些限制需要强制遵守。Web Workers不能进入到页面的DOM,也不能改变页面上的任何东西。Web Worker很适合那种需要后台计算和处理的工作。

 

将CLICK事件替换成TOUCH事件

在触摸屏设备上,当一个用户触碰屏幕的时候,onclick事件并没有立即触发。设备会使用大约半秒(大多数设备差不多都是300毫秒)来让用户确定是手势操作还是点击操作。这个延迟会很明显地影响用户期望的响应性能。要使用touchend事件来替换才能解决。当用户触碰屏幕的时候,这个事件会立即触发。

为了要确保不会产生用户不期望的行为,你应该也要使用touchstart和touchmove事件。例如,除非同时有个touchstart事件在button上,否则不要判断touchend事件在button上就意味着点击行为 — 因为用户有可能从其他地方触碰开始,然后拖拽到button上触碰结束的。你也可以在touchstart事件之后使用touchmove事件来避免将touchend事件误判为点击,当然前提是需要假设拖拽的手势并不是预期产生点击行为。

另外,你也需要去处理onclick事件来让浏览器改变button的外观从而标识为已点击的状态,同时你也需要处理那些不支持touch事件的浏览器。为了避免代码在touchend和onclick代码中重复执行,你需要在确保用户触碰事件已经在touchend执行了之后,在click事件中调用preventDefault和stopPropagation方法。^4

实现小贴士:需要进一步考虑。这种技术需要更多工作才能在一个页面中增加和维护链接。touch事件的代码必须考虑其他手势,因为替换click的还有可能是缩放或者敲击动作。

 

支持SPDY协议

应用层HTTP和HTTPS协议导致的一些性能瓶颈,使得不论是桌面还是移动端的网站都非常难受。在2009年,谷歌开始研发一种叫做SPDY(谐意是”speedy”)的协议来替换已有的协议,这种协议宣称能突破这些限制。这个协议的目标是让多种浏览器和多种Web服务都能支持,所以这个协议是开源的,但是初步地,只有Google的Chrome浏览器(在版本10及之后的)和google的站点支持。一旦一个Web服务支持SPDY,那么它上面的所有站点都可以和支持这个协议的浏览器使用SPDY进行交互。将SPDY应用在25个top100的Internet网站上,Google收集到的数据是网站的速度会改善27%到60%不等。^2

SPDY自动使用gzip压缩所有内容,和HTTP不同的是,它连header的数据也使用gzip压缩。SPDY使用多线程技术让多个请求流或者响应流能共用一个TCP连接。另外SPDY允许请求设置优先级,比如,页面中心的视频会比边框的广告拥有更高的优先级。

或许SPDY中最变革性的发明就是流是双向的,并且可以由客户端或者服务端发起,这样能使得信息能推送到客户端,而不用由客户端发起第一次请求。例如,当一个用户第一次浏览一个站点,还没有任何站点的缓存,这个时候服务端就可以在响应中推送所有的请求资源,而不用等候每个资源被再次独立请求了。作为替换协议,服务端可以发送暗示给客户端,提示页面需要哪些资源,同时也允许由客户端来初始化请求。即使是使用后一种这样的方式也比让客户端解析页面然后自己发现有哪些资源需要被请求来得快。

虽然SPDY并没有对移动端有什么特别的设置,但是移动端有限的带宽就使得如果支持SPDY的话,SPDY在减少移动网站的延迟是非常有用的。

实现小贴士:依据网站和服务的环境来进行平稳操作或进一步考虑。Google有一个SPDY模块支持Apache2.2 – mod_spdy – 这个模块是免费的;但是mod_spy有线程上的问题,并且和mod_php协作并不是很好,所以要求你使用这个技术的时候要确保你的网站的正常运行。^6

 

永远别忘记测试!

如果缺少了持续和仔细的测试提醒,性能的优化就只是讨论而已,是无法完成的。如果没有指定基准做比较,你系统上的任何改动都仅仅是理论而已。如果没有真实的测试数据,猜测性能的瓶颈是毫无意义的。

有很多开源和通用的工具能进行集成测试,并且能进行不同地域和带宽/延迟的测试。另外,RUM(real user monitoring)工具能将测试环境从实验室变成不可预测的真实用户行为。

观察移动设备的测试选择和桌面场景一样。如果你在选择一个自动化的解决方案,请确保使用一个能持续测试,并且能区分出应用优化方法前后的变化的解决方案。

如果性能优化如果只是在发展过程中的一个步骤而已,它不会有什么效果的。它必须成为一个持续改善网站的一部分。

 

参考:

1. Bustos, L. 2009. Every second counts; how website performance impacts shopper behavior. GetElastic;http://www.getelastic.com/performance/.

2. Chromium Projects. SPDY: an experimental protocol for a faster Web;https://sites.google.com/a/chromium.org/dev/spdy/spdy-whitepaper.

3. Everts, T. 2013. Case study: how effective are CDNs for mobile visitors. Web Performance Today;http://www.Webperformancetoday.com/2013/05/09/case-study-cdn-content-delivery-network-mobile-3g/.

4. Fioravanti, R. 2011. Creating fast buttons for mobile Web applications. Google Developers;http://code.google.com/mobile/articles/fast_buttons.html.

5. Linden, G. 2006. Marissa Mayer at Web 2.0. Geeking with Greg;http://glinden.blogspot.com/2006/11/marissa-mayer-at-Web-20.html.

6. mod-spdy; http://code.google.com/p/mod-spdy/.

7. PhoCusWright. 2010. PhoCusWright/Akamai study on travel site performance;http://connect.phocuswright.com/2010/06/phocuswrightakamai-study-on-travel-site-performance/;http://www.akamai.com/dl/whitepapers/Akamai_PCW_Travel_Perf_Whitepaper.pdf.

8. Radware. 2011. Case studies from the mobile frontier: the relationship between faster mobile sites and business KPIS; http://www.strangeloopnetworks.com/resources/research/state-of-mobile-ecommerce-performance/.

9. Bixby, J. 2012. 2012 state of mobile e-commerce performance;http://www.strangeloopnetworks.com/resources/videos/case-studies-from-the-mobile-frontier-the-relationship-between-faster-mobile-sites-and-business-kpis-video/.

10. Tealeaf. 2011. Report on the Mobile Customer Experience. Based on the Harris Interactive 2011 Mobile Transactions Survey.

11. W3C. 2012. Network Information API; http://www.w3.org/TR/netinfo-api/.

12. YUI. ImageLoader. Yahoo! User Interface Library; http://yuilibrary.com/yui/docs/imageloader/.

 

 

原文链接: Tammy Everts   翻译: 伯乐在线 – 伯乐在线读者译文链接: http://blog.jobbole.com/46599/

Linux:4 款 Linux 下免费好用的时钟软件

Linux 的一大优势就是有各种在开源许可证下的小应用程序可以让大家免费使用。

当然了,时钟这东西,系统都会自带有,通常在任务栏或者菜单栏那里固定显示系统时间,除了实用外没什么特别的。不过今天给大家介绍几款比系统时间好看好玩的多的时钟应用给大家。做工精良、开源、短小精悍是它们的特点。看看大家喜欢不。

Alarm Clock 功能众多的闹钟,可以显示在您的 GNOME 面板上。

Linux:4 款 Linux 下免费好用的时钟软件
Linux:4 款 Linux 下免费好用的时钟软件

intclock 国际时间的时钟。

Wakeup 定时唤醒功能和特定语音的时钟。

Linux:4 款 Linux 下免费好用的时钟软件
Linux:4 款 Linux 下免费好用的时钟软件

FoxClocks 可以显示在状态条上的世界时钟

Linux:4 款 Linux 下免费好用的时钟软件
Linux:4 款 Linux 下免费好用的时钟软件
 已同步至 linux的微博

来源:https://linux.cn/article-1884-1.html

Linux:版本控制工具历史的10个里程碑

引言:“如果你想要了解真正的历史,你需要回到在打孔卡上进行人工比对的年代。” —— Jim Rootham

在这个为鳕鱼编写传记都能够流行的年代,写一本记录程序员如何存储代码——他们最重要的劳动成果的书一点也不疯狂。

既然你和我都没有时间来阅读或编写这样的一本书,我们打算用这篇博文来进行探讨。

这是一个重要的问题。(现在)版本控制产品非常普通而且很流行。然而,它经历了几十年的不断创新。在这个领域里最聪明的人的努力下,代码管理变得非常简单而且有效。每一步都是那么让人感到惊奇。

Linux:版本控制工具历史的10个里程碑
Linux:版本控制工具历史的10个里程碑

1. 源代码就是一个文本文件!(20世纪60年代)

现在看来,存储源代码和编写简单文档应该是一样的。但如果你简单读一下ASCII的历史就会知道,即使达成这样的共识也来之不易。

2. 人们可以手动跟踪代码版本!(20世纪60年代)

在没有软件的年代,所有事情都要从源代码开始。

“我工作的第一家公司有一个源码管理部门。当你把代码写好以后,将软盘交给源码管理部门一位漂亮女士。他们会及时更新函数库,用你的磁盘基于公司官方的代码构建产品交付给客户。” —— Miles Duke

3. 你可以为单个文件保留多个版本!(1972,1978)

采用奇特的交错编织文件格式,SCCS在版本控制领域称雄了10年之久。

记录单个文件的从一个版本到下一个之间的变化花费了几年的时间。“差异文件比较算法”是这个课题最近发表的一篇论文(1976)。

1982年,RCS反向使用diff文件(描述算法原文)打败了SCCS成为继任者,并让评论家大跌眼镜:

“一起出现的还有带有反向比较功能的RCS,我认为它非常棒。” —— 无名氏

4. 每个人都可以检出自己的拷贝!(1982)

在那个时候,人们工作时需要登录一台中央大型机并通过它一起工作。采用符号链接,RCS可以让每个人都工作在相同版本的代码上,而且每个人都有自己的工作拷贝。

“有一个叫做RCS的文件,实际上它十一个链接到RCS仓库的符号链接,你可以与其他小组成员一起使用。”  —— 耶鲁大学RCS使用介绍

5. 喔!你可以一次给多个文件进行版本控制!(1986)

令人吃惊的是,直到CVS出现之前,版本控制系统都只支持单个文件。当然,你可以使用通配符让RCS提交多个文件或者标记特定分支。但这些并不是版本控制系统的一部分。

CVS默认会递归修改所有文件。突然之间,软件从单个目录或文件变成了文本文件的递归树。

虽然由于不具备“原子性”导致实现的产品不尽如人意(后来Subversion在2000年解决了这个问题),但是瑕不掩瑜。

6. 两个人可以同时编辑同一个文件,并将他们的工作合并在一起!(1986)

20世纪90年代末,我在Creature Labs工作。我们从Visual SourceSafe(商业软件,微软公司发布)转到CVS(开源软件,由一些嘻皮士发布)。

坦率的讲,大家都怀疑CVS能否做到它宣称的那样:让多个人同时编辑同一个文件,并将他们的修改没有错误地合并到一起而不造成其他问题。

在我们开发Creatures 3的时候,SourceSafe的互斥锁成为了一个大问题。我们当时要添加垃圾搜集功能,这个功能会影响到几乎所有的代码。这个时候,我们的首席程序员不得不在周末检出每一个文件然后进行修改。

1986年的这篇论文记录下了这个奇迹。当Dick Grune和他的团队在荷兰开发一个编译器的时候,他们遇到了同样的问题,CVS从此应运而生。

7. 可以在远程服务器上共享代码仓库!(1994)

大多数时候,人们只在一台机器上使用版本控制。在1986年,人们可以通过RCS的一些版本以及CVS提供的远程文件共享机制以拥有远程代码仓库。

“假如RCS的某个版本可以通过远程服务器访问,那么开发人员就可以在代码仓库之外的机器上进行开发了。”  —— Dick Grune

然而,直到1994年TCP/IP协议的引入,这个想法才得以起步。

“直到Cygnus软件的Jim Blandy和Karl Fogel(这两位后来成为Subversion项目的主要开发者)为CVS发布了一些补丁,使得CVS客户端软件可以通过远程TCP/IP连接进行访问,CVS才真正变得无处不在。 ”—— Eric Raymond

8. 免费的开源版本控制主机服务!(1999)

这并不是源码管理技术的进步,但这的确是一个标志,Internet社区的发展与技术的进步同等重要:

“OSS以及成为历史,这已经成为一种趋势。John T. Hall 预见到,如果项目都是在线开发,那么之前开发的版本就在那里。开发平台服务是一种创新,但是没有人去做,我们就想‘为什么不呢?’”——Brian Biles

就像末日狂欢那样(因为股票的原因),VA Linux把SourceForge带到了这个世界上。这对新项目是天大的好消息(例如我的TortoiseCVS)。

在当时,在Internet上获得一台服务器很困难而且非常昂贵,进行源码管理和bug追踪也是如此。这项新服务尽管缺乏商业模式,却让无数项目更早地面世。

译注:OSS:一个综合的业务运营和管理平台,同时也是真正融合了传统IP数据业务与移动增值业务的综合管理平台。

9. 没有主代码库,你可以向所有人发布!(2005)

在21世纪头10年,有一股将版本控制实现完全分布式的潮流。

也就是说,在你本地的机器上存放的是一份完整的代码历史,可以轻易地与任何其他拷贝进行分支和合并。顺带说一下,也正是这个特性使得分支和合并变得更加容易。

我并没有记录某个第一次发明这种工具,而是按照它产品化以及流行的时间进行统计。鉴于此,将它定在2005年似乎有些不公平。Mercurial和Git发布于2005年4月。

这篇“分布式版本控制风险”(2005年底)介绍了这个革命性的创新。

10. 当你检出一个fork,你可以让大家都看到!(2008)

GitHub的成功有很多原因(尽管我之前提到过一些,要讲清楚这个问题还是需要单独写一篇文章讨论)。

关键在于,你可能甚至可以将一些自己做的不大的改动提交到别人的公共代码上。在GitHub之前,一般我们会保存在自己的电脑上。

如今,只需要简单做一个fork,或者甚至可以直接在浏览器上编辑,这样任何人都可以马上发现你代码中的bug。

尾声

快速回顾一下这几十年的进展。是的,计算机的发展做出了贡献。但更主要的是,这些都是人们为更好地协作而贡献出的聪明才智。

这让我想到,下一个会是什么?在版本控制领域还会有什么令人惊叹的事情发生?

推而广之,同样的事情会在其它领域发生吗?

作为核心信息基础设施,这种巨大的改进能够最终改善政府、医疗、新闻或者数据领域创新的障碍吗?

我有这种感觉,我们就要找到答案了。

想了解更多吗?请阅读《版本控制时间轴》(发表于Plastic SCM的博客,不要忘记看一下评论)以及《理解版本控制系统》(作者Eric Raymond)

 

英文原文:frabcus   编译:伯乐在线 – 唐尤华

Linux:Sismics Reader: Google Reader的一个本地替代品

到现在你肯定知道Google Reader已经死了。你可能和许多读者一样,已经转向了Feedly,或其他GR替代品。但万一你选择的替代商决定不提供服务了呢?万一他们的服务器出问题了呢?百分之百不再对其他RSS服务失望的唯一出路是自己搭建!这正是Sismics Reader的出发点。

Sismics Reader是一个开源而免费的Google Reader替代品,它能让你在自己的PC,Mac或基于Linux的机器上搭建RSS服务。下面我将一步步示范在Windows上搭建和在安卓手机上使用它的过程。

开始

第一步当然是下载Sismics Reader。无论你在使用什么系统,它都有相应的文件格式。对了,如果你系统还没有java要先去下载,Sismics Reader的运行离不开它。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

安装好后,下一步就没那么明显了。至少我安装后它没有弹出任何配置窗口。但实际上,它在任务栏右下角创建了一个绿色的RSS图标。

右击这个图标,会看到两个选项:在浏览器打开它,或者打开控制面板。控制面板很简洁,有两个标签页。它显示了什么时候开始服务,已经占用了多少内存等信息。如果你不想碰这些看起来有点技术的东西,暂时先忽略控制面板然后点击“Open Reader in Browser”(即在浏览器打开Reader)。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

首先它会让你登录,用户名和密码均为“admin”(你得在登录后马上修改)。之后,你可以选择是否使用UPnP(我失败了,但对你可能有用,只要你知道相关的安全缺陷)。接着建立第一个用户,然后就差不多了。这个软件的一个方便之处就是允许你拥有不同用户,且分别保有不同的设置。因此你可以为整个家庭搭建所有RSS订阅服务。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

如果你事先使用Google Takeout导出了自己的feed数据,那真是聪明的做法,因为Takeout好像已经不再提供导出服务了。我也够幸运,事先把自己的订阅迁移到Feedly上去。所以我现在可以从Feedly导出数据了,对吧?

好吧,也没那么顺利。匆匆支持OPML导出后,Feeely在帮助页面提供了这个建议,其实就是指引用户到一个页面,在那里可以他们复制和粘贴OPML数据到一个空文件里去。当时我尝试着做了,却发现Sismcis不支持OPML格式。这让我转向Sismics变得困难了点。然而现在Sismics已经支持OPML文件了,仅需简单的点击一个按钮即可。

使用

Sismics浏览界面十分简洁,在Latest选项下你可以阅读所有未读文章,浏览所有文章,或者只是你收藏了的那些。在它下面是你的订阅列表,你可以分类整理。你也可以拖拽它们上下移动,不过不能这样子把它们放到另一个文件夹里,这样做也很不直观。相反,你得点开这个订阅再点击右上角的”Categories”,再为它选择一个类别。还不算太糟,但有点儿麻烦。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

查看内容时有两种方式:每条一行文字的列表,或者以图片加文章首段的方式列出来。如果你选择前者,每次点击一篇文章都会打开出现一个更大的页面,上面是一张图片和一段介绍。要阅读全文,它会在新标签里打开网页。

安卓上使用

至于安卓应用,配置起来需要一点点IP地址的知识。它会要你输入服务器地址,还有用户名和密码。服务器地址就像这种格式:11.1.1.11:4001 。4001是可以在控制面板自定义的端口号,如果你不知道自己电脑的IP地址,可以打开命令提示符(搜索cmd),敲入”ipconfig”(不包含引号)再回车。看看写着“IPv4 地址”的地方,那就是你的内部IP地址。这个地址让你可以在任何一台连接到家庭网络的设备访问RSS服务,只要把它敲入浏览器的地址栏即可。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

可以想象,它的安卓应用也十分简单,用户界面和其他谷歌应用比如Play Music, YouTube很相似。你只有刷新和设置这两个按钮,还有两个选项:退出登录和浏览相关信息。从左滑动或点击左上角可以看到订阅列表,还有查看未读或收藏的文章。要注意的是,它不提供增加订阅的功能。你只能在电脑上完成这项工作。

Linux:Sismics Reader: Google Reader的一个本地替代品
Linux:Sismics Reader: Google Reader的一个本地替代品

这里的界面和电脑上的单行列表界面一样。点击文章可以看到主图片和介绍段落,还有一条供阅读全文的链接。

总结

在桌面上使用RSS服务肯定有一些不足,但Sismics Reader让一切变得简洁易做。比如,只要你和运行着sismics reader的电脑连接到同一个WiFi就能查看RSS最新订阅了。而且我相信sismics reader将会继续增加新特性,由于它是开源的你甚至可以在Github上提交贡献。

另外,你不必担心sismics reader会关闭。即使未来他们停止支持这项服务了你也可以继续使用它。你永远不必再经历一次Google Reader般痛苦的过程。

你是否有另一个自己喜欢的RSS阅读器?你认为sismics reader怎么样?在评论里留言让我们知道吧!

原文链接: Justin Dennis 翻译: 极客范 – 钟益强译文链接: http://www.geekfan.net/3263/

Linux:社会化海量数据采集爬虫框架搭建

随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前。如何能够做到所见即所得的无阻拦式采集、如何快速把不规则页面结构化并存储、如何满足越来越多的数据采集还要在有限时间内采集。这篇文章结合我们自身项目经验谈一下。

基本的例子

我们来看一下作为人是怎么获取网页数据的呢?

1、打开浏览器,输入网址url访问页面内容。2、复制页面内容的标题、作者、内容。3、存储到文本文件或者excel。

从技术角度来说整个过程主要为 网络访问、扣取结构化数据、存储。我们看一下用java程序如何来实现这一过程。

import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;
public class HttpCrawler {
  public static void main(String[] args) {
    String content = null ;
    try {
      HttpClient httpClient = new HttpClient();
      //1、网络请求
      GetMethod method = new GetMethod("http://www.baidu.com" );
      int statusCode = httpClient.executeMethod(method);
      if (statusCode == HttpStatus. SC_OK) {
        content = method.getResponseBodyAsString();
        //结构化扣取
        String title = StringUtils.substringBetween(content,"","");
        //存储
        System.out.println(title);
      }
    } catch (HttpException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
  }
}
通过这个例子,我们看到通过httpclient获取数据,通过字符串操作扣取标题内容,然后通过system.out输出内容。大家是不是感觉做一个爬虫也还是蛮简单呢。这是一个基本的入门例子,我们再详细介绍怎么一步一步构建一个分布式的适用于海量数据采集的爬虫框架。

爬虫框架

整个框架应该包含以下部分:资源管理反监控管理抓取管理监控管理

看一下整个框架的架构图:

Linux:社会化海量数据采集爬虫框架搭建
Linux:社会化海量数据采集爬虫框架搭建
  • 资源管理指网站分类体系、网站、网站访问url等基本资源的管理维护;
  • 反监控管理指被访问网站(特别是社会化媒体)会禁止爬虫访问,怎么让他们不能监控到我们的访问时爬虫软件,这就是反监控机制了;

反监控

一个好的采集框架,不管我们的目标数据在哪儿,只要用户能够看到都应该能采集到。所见即所得的无阻拦式采集,无论是否需要登录的数据都能够顺利采集。

现在大部分社交网站都需要登录,为了应对登录的网站要有模拟用户登录的爬虫系统,才能正常获取数据。不过社会化网站都希望自己形成一个闭环,不愿意把数据放到站外,这种系统也不会像新闻等内容那么开放的让人获取。这些社会化网站大部分会采取一些限制防止机器人爬虫系统爬取数据,一般一个账号爬取不了多久就会被检测出来被禁止访问了。

那是不是我们就不能爬取这些网站的数据呢?肯定不是这样的,只要社会化网站不关闭网页访问,正常人能够访问的数据,我们也能访问。说到底就是模拟人的正常行为操作,专业一点叫“反监控”。

那一般网站会有什么限制呢?

  • 一定时间内单IP访问次数。没有哪个人会在一段持续时间内过快访问,除非是随意的点着玩,持续时间也不会太长。可以采用大量不规则代理IP来模拟。
  • 一定时间内单账号访问次数。这个同上,正常人不会这么操作。可以采用大量行为正常的账号,行为正常就是普通人怎么在社交网站上操作,如果一个人一天24小时都在访问一个数据接口那就有可能是机器人了。

如果能把账号和IP的访问策略控制好了,基本可以解决这个问题了。当然对方网站也会有运维会调整策略,说到底这是一个战争,躲在电脑屏幕后的敌我双方,爬虫必须要能感知到对方的反监控策略进行了调整,通知管理员及时处理。未来比较理想应该是通过机器学习算法自动完成策略调整,保证抓取不间断。

抓取管理

抓取管理指通过url,结合资源、反监控抓取数据并存储;我们现在大部分爬虫系统,很多都需要自己设定正则表达式,或者使用htmlparser、jsoup等软件来硬编码解决结构化抓取的问题。

不过大家在做爬虫也会发现,如果爬取一个网站就去开发一个类,在规模小的时候还可以接受,如果需要抓取的网站成千上万,那我们不是要开发成百上千的类。

为此我们开发了一个通用的抓取类,可以通过参数驱动内部逻辑调度。比如我们在参数里指定抓取新浪微博,抓取机器就会调度新浪微博网页扣取规则抓取节点数据,调用存储规则存储数据,不管什么类型最后都调用同一个类来处理。对于我们用户只需要设置抓取规则,相应的后续处理就交给抓取平台了。

整个抓取使用了 xpath、正则表达式、消息中间件、多线程调度框架(参考)。

  • xpath 是一种结构化网页元素选择器,支持列表和单节点数据获取,他的好处可以支持规整网页数据抓取。我们使用的是google插件 XPath Helper,这个玩意可以支持在网页点击元素生成xpath,就省去了自己去查找xpath的功夫,也便于未来做到所点即所得的功能。
  • 正则表达式补充xpath抓取不到的数据,还可以过滤一些特殊字符。
  • 消息中间件,起到抓取任务中间转发的目的,避免抓取和各个需求方耦合。比如各个业务系统都可能抓取数据,只需要向消息中间件发送一个抓取指令,抓取平台抓完了会返回一条消息给消息中间件,业务系统在从消息中间件收到消息反馈,整个抓取完成。
  • 多线程调度框架之前提到过,我们的抓取平台不可能在同一时刻只抓一个消息的任务;也不可能无限制抓取,这样资源会耗尽,导致恶性循环。这就需要使用多线程调度框架来调度多线程任务并行抓取,并且任务的数量,保证资源的消耗正常。

异常处理

不管怎么模拟总还是会有异常的,这就需要有个异常处理模块,有些网站访问一段时间需要输入验证码,如果不处理后续永远返回不了正确数据。我们需要有机制能够处理像验证码这类异常,简单就是有验证码了人为去输入,高级一些可以破解验证码识别算法实现自动输入验证码的目的。

扩展一下

所见即所得我们是不是真的做到?规则配置也是个重复的大任务?重复网页如何不抓取?

1、有些网站利用js生成网页内容,直接查看源代码是一堆js。

可以使用mozilla、webkit等可以解析浏览器的工具包解析js、ajax,不过速度会有点慢。

2、网页里有一些css隐藏的文字

使用工具包把css隐藏文字去掉。

3、图片flash信息

如果是图片中文字识别,这个比较好处理,能够使用ocr识别文字就行,如果是flash目前只能存储整个url。

4、一个URL有多个网页结构

如果只有一套抓取规则肯定不行的,需要多个规则配合抓取。

5、html不完整,不完整就不能按照正常模式去扣取。

这个时候用xpath肯定解析不了,我们可以先用htmlcleaner清洗网页后再解析。

6、 如果网站多起来,规则配置这个工作量也会非常大。

如何帮助系统快速生成规则呢?首先可以配置规则可以通过可视化配置,比如用户在看到的网页想对它抓取数据,只需要拉开插件点击需要的地方,规则就自动生成好了。另在量比较大的时候可视化还是不够的,可以先将类型相同的网站归类,再通过抓取的一些内容聚类,可以统计学、可视化抓取把内容扣取出几个版本给用户去纠正,最后确认的规则就是新网站的规则。这些算法后续再讲。

这块再补充一下(多谢zicjin建议)

背景:如果我们需要抓取的网站很多,那如果靠可视化配置需要耗费大量的人力,这是个成本。并且这个交给不懂html的业务去配置准确性值得考量,所以最后还是需要技术做很多事情。那我们能否通过技术手段可以帮助生成规则减少人力成本,或者帮助不懂技术的业务准确的把数据扣取下来并大量复制。

方案:先对网站分类,比如分为新闻、论坛、视频等,这一类网站的网页结构是类似的。在业务打开需要扣取的还没有录入我们规则库的网页时,他先设定这个页面的分类(当然这个也可以机器预先判断,他们来选择,这一步必须要人判断下),有了分类后,我们会通过“统计学、可视化判断”识别这一分类的字段规则,但是这个是机器识别的规则,可能不准确,机器识别完后,还需要人在判断一下。判断完成后,最后形成规则才是新网站的规则

7、对付重复的网页。

如果重复抓取会浪费资源,如果不抓需要一个海量的去重判断缓存。判断抓不抓,抓了后存不存,并且这个缓存需要快速读写。常见的做法有bloomfilter、相似度聚合、分类海明距离判断。

  • 监控管理指不管什么系统都可能出问题,如果对方服务器宕机、网页改版、更换地址等我们需要第一时间知道,这时监控系统就起到出现了问题及时发现并通知联系人。

抓取平台架构

目前这样的框架搭建起来基本可以解决大量的抓取需求了。通过界面可以管理资源、反监控规则、网页扣取规则、消息中间件状态、数据监控图表,并且可以通过后台调整资源分配并能动态更新保证抓取不断电。

不过如果一个任务的处理特别大,可能需要抓取24个小时或者几天。比如我们要抓取一条微博的转发,这个转发是30w,那如果每页线性去抓取耗时肯定是非常慢了,如果能把这30w拆分很多小任务,那我们的并行计算能力就会提高很多。不得不提的就是把大型的抓取任务hadoop化,废话不说直接上图:

Linux:社会化海量数据采集爬虫框架搭建
Linux:社会化海量数据采集爬虫框架搭建

今天先写到这里,后续再介绍下 日均千万大型采集项目实战。

转载自LANCEYAN.COM 社会化海量数据采集爬虫框架搭建  (为便于阅读,有部分格式调整)

Linux:怎样在 ubuntu 上安装 Linux 3.11 内核

Linus Torvalds 已经发布了最新的 Linux 3.11 内核,有很多童鞋也和我一样很像尝尝鲜,但是我要说升级内核有很大风险,升级之后可能无法启动系统。使用 Ubuntu 官方提供的 DEB 安装包,打开终端使用命令下载:

32 位系统下载:

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-headers-3.11.0-031100-generic_3.11.0-031100.201309021735_i386.deb

 

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-headers-3.11.0-031100_3.11.0-031100.201309021735_all.deb

 

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-image-3.11.0-031100-generic_3.11.0-031100.201309021735_i386.deb

64 位系统下载:

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-headers-3.11.0-031100-generic_3.11.0-031100.201309021735_amd64.deb

 

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-headers-3.11.0-031100_3.11.0-031100.201309021735_all.deb

 

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.11-saucy/linux-image-3.11.0-031100-generic_3.11.0-031100.201309021735_amd64.deb

CD 到你的下载目录:

cd /home/下载目录

安装内核命令:

sudo dpkg -i linux-headers-3.11.0*.deb linux-image-3.11.0*.deb

然后重启系统。

 

来自:http://imcn.me/html/y2013/15688.html