28个Unix/Linux的命令行神器 [自动转]

下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的。这些工具都非常不错,希望每个人都知道。本篇文章还在Hacker News上被讨论,你可以过去看看。我以作者的原文中加入了官网链接和一些说明。

dstat & sar

iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在《性能调优攻略》中提到过那三个xxstat工具)。

官方网站:http://dag.wieers.com/rpm/packages/dstat/

你可以这样使用:

alias dstat='dstat -cdlmnpsy'

dstat screenshot

slurm

查看网络流量的一个工具

官方网站:  Simple Linux Utility for Resource Management

slurm screenshot

vim & emacs

真正程序员的代码编辑器。

vim screenshot

screen, dtach, tmux, byobu

你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。请参看IBM DeveloperWorks的这篇文章《使用 screen 管理你的远程会话

gnu screen screenshot

dtach 是用来模拟screen的detach的功能的小工具,其可以让你随意地attach到各种会话上 。下图为dtach+dvtm的样子。

tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。与screen相比的优点:可以横向和纵向分割窗口,且窗格可以自由移动和调整大小。可在多个缓冲区进行复制和粘贴,支持跨窗口搜索;非正常断线后不需重新detach;……  有人说——与tmux相比,screen简直弱爆了

byobu是Ubuntu开发的,在Screen的基础上进行包装,使其更加易用的一个工具。最新的Byobu,已经是基于Tmux作为后端了。可通过“byobu-tmux”这个命令行前端来接受各种与tmux一模一样的参数来控制它。Byobu的细节做的非常好,效果图如下:

multitail

MultiTail是个用来实现同时监控多个文档、类似tail命令的功能的软件。他和tail的区别就是他会在控制台中打开多个窗口,这样使同时监控多个日志文档成为可能。他还可以看log文件的统计,合并log文件,过滤log文件,分屏,……。

官网:http://www.vanheusden.com/multitail/

multitail screenshot

tpp

终端下的PPT,要是在某某大会上用这个演示PPT,就太TMD的Geek了。

官网:http://www.ngolde.de/tpp.html

tpp screenshot

xargs & parallel

Executes tasks from input (even multithread).

xargs 是一个比较古老的命令,有简单的并行功能,这个不说了。对于GNU parallel ( online manpage )来说,它不仅能够处理本机上多执行绪,还能分散至远端电脑协助处理。而使用GNU parallel前,要先确定本机有安装GNU parallel / ssh / rsync,远端电脑也要安装ssh。

xargs screenshot

duplicity & rsyncrypto

Duplicity是使用rsync算法加密的高效率备份软件,Duplicity支持目录加密生产和格式上传到远程或本地文件服务器。

rsyncrypto 就是 rsync + encryption。对于rsync的算法可参看酷壳的rsync核心算法

Encrypting backup tools.

duplicity screenshot

nethack & slash’em

NetHackWiki),20年历史的古老电脑游戏。没有声音,没有漂亮的界面,不过这个游戏真的很有意思。网上有个家伙说:如果你一生只做一件事情,那么玩NetHack。这句话很惹眼,但也让人觉得这个游戏很复杂不容易上手。其实,这个游戏很虽然很复杂,却容易上手。虽然玩通关很难,但上手很容易。NetHack上有许多复杂的规则,”the DevTeam thinks of everything”(开发团队想到了所有的事情)。各种各样的怪物,各种各样的武器….,有许多spoilers文件来说明其规则。除了每次开始随机生成的地图,每次玩游戏,你也都会碰到奇怪的事情: 因为喝了一种药水,变成了机器人;因为踢坏了商店的门被要求高价赔偿;你的狗为你偷来了商店的东西….. 这有点象人生,你不能完全了解这个世界,但你仍然可以选择自己的面对方式。

网上有许多文章所这是最好的电脑游戏或最好的电脑游戏之一。也许是因为它开放的源代码让人赞赏,古老的历史让人宽容,复杂的规则让人敬畏。虽然它不是当前流行的游戏,但它比任何一个当前流行的游戏都更有可能再经受20年的考验。

Slash’EM 也是一个基于NetHack的经典游戏。

nethack screenshot

lftp

利用lftp命令行ftp工具进行网站数据的增量备份,镜像,就像使用rsync一样。

lftp screenshot

ack

ack是一个perl脚本,是grep的一个可选替换品。其可以对匹配字符有高亮显示。是为程序员专门设计的,默认递归搜索,省提供多种文件类型供选。

ack screenshot

calcurse & remind + wyrd

calcurse是一个命令行下的日历和日程软件。remind + wyrd也很类似。关于日历,我不得不提一个Linux的Cycle日历,也是一个神器,呵呵。

calcurse screenshot

newsbeuter & rsstail

newsbeuter rsstail 是命令行下RSS的阅读工具。

newsbeuter screenshot

powertop

做个环保的程序员,看看自己的电脑里哪些程序费电。PowerTOP 是一个让 Intel 平台的笔记本电脑节省电源的 Linux 工具。此工具由 Intel 公司发布。它可以帮助用户找出那些耗电量大的程序,通过修复或者关闭那些应用程序或进程,从而为用户节省电源。

powertop screenshot

htop & iotop

htop 和 iotop  用来查看进程,内存和IO负载。

htop screenshot

ttyrec & ipbt

ttyrec 是一个 tty 控制台录制程序,其所录制的数据文件可以使用与之配套的 ttyplay 播放。不管是你在 tty 中的各种操作,还是在 tty 中耳熟能详的软件,都可进行录制。

ipbt 是一个用来回放 ttyrec 所录制的控制台输入过程的工具。

与此类似的还有Shelr 和 termrec 

ipbt screenshot

rsync

通过SSH进行文件同步的经典工具(核心算法

rsync screenshot

mtr

MTR – traceroute 2.0,其是把 traceroute 和 ping 集成在一块的一个小工具 用于诊断网络。

mtr screenshot

socat & netpipes

socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版。

netpipes 和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。

socat screenshot

iftop & iptraf

iftopiptraf可以用来查看当前网络链接的一些流量情况。

iftop screenshot

siege & tsung

Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器。针对 HTTP 测试,Tsung 支持 HTTP 1.0/1.1 ,包含一个代理模式的会话记录、支持 GET、POST 和 PUT 以及 DELETE 方法,支持 Cookie 和基本的 WWW 认证,同时还支持 SSL。

参看:十个免费的Web压力测试工具

siege screenshot

ledger

ledger 一个命令行下记帐的小工具。

ledger screenshot

taskwarrior

TaskWarrior 是一个基于命令行的 TODO 列表管理工具。主要功能包括:标签、彩色表格输出、报表和图形、大量的命令、底层API、多用户文件锁等功能。

taskwarrior screenshot

下图是TaskWarrior 2.0的界面:

curl

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。cURL支援的通訊協定有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

curl screenshot

rtorrent & aria2

rTorrent 是一个非常简洁、优秀、非常轻量的BT客户端. 它使用了 ncurses 库以 C++ 编写, 因此它完全基于文本并在终端中运行. 将 rTorrent 用在安装有 GNU Screen 和 Secure Shell 的低端系统上作为远程的 BT 客户端是非常理想的。

aria2 是 Linux 下一个不错的高速下载工具。由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件。这样自然就大大加快了文件的下载速度。aria2 也具有断点续传功能,这使你随时能够恢复已经中断的文件下载。除了支持一般的 http(s) 和 ftp 协议外,aria2 还支持 BitTorrent 协议。这意味着,你也可以使用 aria2 来下载 torrent 文件。

 rtorrent screenshot

ttytter & earthquake

TTYtter 是一个Perl写的命令行上发Twitter的工具,可以进行所有其他平台客户端能进行的事情,当然,支持中文。脚本控、CLI控、终端控、Perl控的最愛。

Earthquake也是一个命令行上的Twitter客户端。

ttytter screenshot

vifm & ranger

Vifm 基于ncurses的文件管理器,DOS风格,用键盘操作。

vifm screenshot

Ranger用 Python 完成,默认为使用 Vim 风格的按键绑定,比如 hjkl(上下左右),dd(剪切),yy(复制)等等。功能很全,扩展/可配置性也非常不错。类似MacOS X下Finder(文件管理器)的多列文件管理方式。支持多标签页。实时预览文本文件和目录。

cowsay & sl

cowsay  不说了,如下所示,哈哈哈。还有xcowsay,你可以自己搜一搜。

cowsay screenshot

 sl是什么?ls?,呵呵,你会经常把ls 打成sl吗?如果是的话,这个东西可以让你娱乐一下,你会看到一辆火车呼啸而过~~,相当拉风。你可以使用sudo apt-get install sl 安装。

最后,再介绍一个命令中linuxlogo,你可以使用 sudo apt-get install linuxlogo来安装,然后,就可以使用linuxlogo -L
来看一下各种Linux的logo了

(全文完)

(转载本站文章请注明作者和出处 酷壳 – CoolShell.cn ,请勿用于任何商业用途)

感谢42qu.com为本站提供VPS
您可能也喜欢:


Unix 40年:Unix年鉴


Unix 40年:昨天,今天和明天


Linux/Unix 新手和专家教程


rsync 的核心算法


Unix传奇(下篇)

无觅

相关文章

via 酷壳 – CoolShell.cn http://coolshell.cn/articles/7829.html

Linux process state codes

Here are the different values that the s, stat and state output specifiers
(header “STAT” or “S”) will display to describe the state of a process.

D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct (“zombie”) process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group

性能调优攻略 [自动转]

关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充

在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《代码优化概要》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后面的定位和优化无从谈起。

一、系统性能定义

让我们先来说说如何什么是系统性能。这个定义非常关键,如果我们不清楚什么是系统性能,那么我们将无法定位之。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法,所以,在这里我想告诉大家如何系统地来定位性能。 总体来说,系统性能就是两个事:

  1. Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。
  2. Latency, 系统延迟。也就是系统在处理一个请求或一个任务时的延迟。

一般来说,一个系统的性能受到这两个条件的约束,缺一不可。比如,我的系统可以顶得住一百万的并发,但是系统的延迟是2分钟以上,那么,这个一百万的负载毫无意义。系统延迟很短,但是吞吐量很低,同样没有意义。所以,一个好的系统的性能测试必然受到这两个条件的同时作用。 有经验的朋友一定知道,这两个东西的一些关系:

  • Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低。
  • Latency越好,能支持的Throughput就会越高。因为Latency短说明处理速度快,于是就可以处理更多的请求。

二、系统性能测试

经过上述的说明,我们知道要测试系统的性能,需要我们收集系统的Throughput和Latency这两个值。

  • 首先,需要定义Latency这个值,比如说,对于网站系统响应时间必需是5秒以内(对于某些实时系统可能需要定义的更短,比如5ms以内,这个更根据不同的业务来定义)
  • 其次,开发性能测试工具,一个工具用来制造高强度的Throughput,另一个工具用来测量Latency。对于第一个工具,你可以参考一下“十个免费的Web压力测试工具”,关于如何测量Latency,你可以在代码中测量,但是这样会影响程序的执行,而且只能测试到程序内部的Latency,真正的Latency是整个系统都算上,包括操作系统和网络的延时,你可以使用Wireshark来抓网络包来测量。这两个工具具体怎么做,这个还请大家自己思考去了。
  • 最后,开始性能测试。你需要不断地提升测试的Throughput,然后观察系统的负载情况,如果系统顶得住,那就观察Latency的值。这样,你就可以找到系统的最大负载,并且你可以知道系统的响应延时是多少。

再多说一些,

  • 关于Latency,如果吞吐量很少,这个值估计会非常稳定,当吞吐量越来越大时,系统的Latency会出现非常剧烈的抖动,所以,我们在测量Latency的时候,我们需要注意到Latency的分布,也就是说,有百分之几的在我们允许的范围,有百分之几的超出了,有百分之几的完全不可接受。也许,平均下来的Latency达标了,但是其中仅有50%的达到了我们可接受的范围。那也没有意义。
  • 关于性能测试,我们还需要定义一个时间段。比如:在某个吞吐量上持续15分钟。因为当负载到达的时候,系统会变得不稳定,当过了一两分钟后,系统才会稳定。另外,也有可能是,你的系统在这个负载下前几分钟还表现正常,然后就不稳定了,甚至垮了。所以,需要这么一段时间。这个值,我们叫做峰值极限。
  • 性能测试还需要做Soak Test,也就是在某个吞吐量下,系统可以持续跑一周甚至更长。这个值,我们叫做系统的正常运行的负载极限。

性能测试有很多很复要的东西,比如:burst test等。 这里不能一一详述,这里只说了一些和性能调优相关的东西。总之,性能测试是一细活和累活。

三、定位性能瓶颈

有了上面的铺垫,我们就可以测试到到系统的性能了,再调优之前,我们先来说说如何找到性能的瓶颈。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法。

3.1)查看操作系统负载

首先,当我们系统有问题的时候,我们不要急于去调查我们代码,这个毫无意义。我们首要需要看的是操作系统的报告。看看操作系统的CPU利用率,看看内存使用率,看看操作系统的IO,还有网络的IO,网络链接数,等等。Windows下的perfmon是一个很不错的工具,Linux下也有很多相关的命令和工具,比如:SystemTapLatencyTOP,vmstat, sar, iostat, top, tcpdump等等 。通过观察这些数据,我们就可以知道我们的软件的性能基本上出在哪里。比如:

1)先看CPU利用率,如果CPU利用率不高,但是系统的Throughput和Latency上不去了,这说明我们的程序并没有忙于计算,而是忙于别的一些事,比如IO。(另外,CPU的利用率还要看内核态的和用户态的,内核态的一上去了,整个系统的性能就下来了。而对于多核CPU来说,CPU 0 是相当关键的,如果CPU 0的负载高,那么会影响其它核的性能,因为CPU各核间是需要有调度的,这靠CPU0完成)

2)然后,我们可以看一下IO大不大,IO和CPU一般是反着来的,CPU利用率高则IO不大,IO大则CPU就小。关于IO,我们要看三个事,一个是磁盘文件IO,一个是驱动程序的IO(如:网卡),一个是内存换页率。这三个事都会影响系统性能。

3)然后,查看一下网络带宽使用情况,在Linux下,你可以使用iftop, iptraf, ntop, tcpdump这些命令来查看。或是用Wireshark来查看。

4)如果CPU不高,IO不高,内存使用不高,网络带宽使用不高。但是系统的性能上不去。这说明你的程序有问题,比如,你的程序被阻塞了。可能是因为等那个锁,可能是因为等某个资源,或者是在切换上下文。

通过了解操作系统的性能,我们才知道性能的问题,比如:带宽不够,内存不够,TCP缓冲区不够,等等,很多时候,不需要调整程序的,只需要调整一下硬件或操作系统的配置就可以了

3.2)使用Profiler测试

接下来,我们需要使用性能检测工具,也就是使用某个Profiler来差看一下我们程序的运行性能。如:Java的JProfiler/TPTP/CodePro Profiler,GNU的gprof,IBM的PurifyPlus,Intel的VTune,AMD的CodeAnalyst,还有Linux下的OProfile/perf,后面两个可以让你对你的代码优化到CPU的微指令级别,如果你关心CPU的L1/L2的缓存调优,那么你需要考虑一下使用VTune。 使用这些Profiler工具,可以让你程序中各个模块函数甚至指令的很多东西,如:运行的时间 ,调用的次数CPU的利用率,等等。这些东西对我们来说非常有用。

我们重点观察运行时间最多,调用次数最多的那些函数和指令。这里注意一下,对于调用次数多但是时间很短的函数,你可能只需要轻微优化一下,你的性能就上去了(比如:某函数一秒种被调用100万次,你想想如果你让这个函数提高0.01毫秒的时间 ,这会给你带来多大的性能)

使用Profiler有个问题我们需要注意一下,因为Profiler会让你的程序运行的性能变低,像PurifyPlus这样的工具会在你的代码中插入很多代码,会导致你的程序运行效率变低,从而没发测试出在高吞吐量下的系统的性能,对此,一般有两个方法来定位系统瓶颈:

1)在你的代码中自己做统计,使用微秒级的计时器和函数调用计算器,每隔10秒把统计log到文件中。

2)分段注释你的代码块,让一些函数空转,做Hard Code的Mock,然后再测试一下系统的Throughput和Latency是否有质的变化,如果有,那么被注释的函数就是性能瓶颈,再在这个函数体内注释代码,直到找到最耗性能的语句。

最后再说一点,对于性能测试,不同的Throughput会出现不同的测试结果,不同的测试数据也会有不同的测试结果。所以,用于性能测试的数据非常重要,性能测试中,我们需要观测试不同Throughput的结果

四、常见的系统瓶颈

下面这些东西是我所经历过的一些问题,也许并不全,也许并不对,大家可以补充指正,我纯属抛砖引玉。关于系统架构方面的性能调优,大家可移步看一下《由12306.cn谈谈网站性能技术》,关于Web方面的一些性能调优的东西,大家可以看看《Web开发中需要了解的东西》一文中的性能一章。我在这里就不再说设计和架构上的东西了。

一般来说,性能优化也就是下面的几个策略:

  • 用空间换时间。各种cache如CPU L1/L2/RAM到硬盘,都是用空间来换时间的策略。这样策略基本上是把计算的过程一步一步的保存或缓存下来,这样就不用每次用的时候都要再计算一遍,比如数据缓冲,CDN,等。这样的策略还表现为冗余数据,比如数据镜象,负载均衡什么的。
  • 用时间换空间。有时候,少量的空间可能性能会更好,比如网络传输,如果有一些压缩数据的算法(如前些天说的“Huffman 编码压缩算法” 和 “rsync 的核心算法”),这样的算法其实很耗时,但是因为瓶颈在网络传输,所以用时间来换空间反而能省时间。
  • 简化代码。最高效的程序就是不执行任何代码的程序,所以,代码越少性能就越高。关于代码级优化的技术大学里的教科书有很多示例了。如:减少循环的层数,减少递归,在循环中少声明变量,少做分配和释放内存的操作,尽量把循环体内的表达式抽到循环外,条件表达的中的多个条件判断的次序,尽量在程序启动时把一些东西准备好,注意函数调用的开销(栈上开销),注意面向对象语言中临时对象的开销,小心使用异常(不要用异常来检查一些可接受可忽略并经常发生的错误),…… 等等,等等,这连东西需要我们非常了解编程语言和常用的库。
  • 并行处理。如果CPU只有一个核,你要玩多进程,多线程,对于计算密集型的软件会反而更慢(因为操作系统调度和切换开销很大),CPU的核多了才能真正体现出多进程多线程的优势。并行处理需要我们的程序有Scalability,不能水平或垂直扩展的程序无法进行并行处理。从架构上来说,这表再为——是否可以做到不改代码只是加加机器就可以完成性能提升?

总之,根据2:8原则来说,20%的代码耗了你80%的性能,找到那20%的代码,你就可以优化那80%的性能。 下面的一些东西都是我的一些经验,我只例举了一些最有价值的性能调优的的方法,供你参考,也欢迎补充。

4.1)算法调优。算法非常重要,好的算法会有更好的性能。举几个我经历过的项目的例子,大家可以感觉一下。

  • 一个是过滤算法,系统需要对收到的请求做过滤,我们把可以被filter in/out的东西配置在了一个文件中,原有的过滤算法是遍历过滤配置,后来,我们找到了一种方法可以对这个过滤配置进行排序,这样就可以用二分折半的方法来过滤,系统性能增加了50%。
  • 一个是哈希算法。计算哈希算法的函数并不高效,一方面是计算太费时,另一方面是碰撞太高,碰撞高了就跟单向链表一个性能(可参看Hash Collision DoS 问题)。我们知道,算法都是和需要处理的数据很有关系的,就算是被大家所嘲笑的“冒泡排序”在某些情况下(大多数数据是排好序的)其效率会高于所有的排序算法。哈希算法也一样,广为人知的哈希算法都是用英文字典做测试,但是我们的业务在数据有其特殊性,所以,对于还需要根据自己的数据来挑选适合的哈希算法。对于我以前的一个项目,公司内某牛人给我发来了一个哈希算法,结果让我们的系统性能上升了150%。(关于各种哈希算法,你一定要看看StackExchange上的这篇关于各种hash算法的文章 )
  • 分而治之和预处理。以前有一个程序为了生成月报表,每次都需要计算很长的时间,有时候需要花将近一整天的时间。于是我们把我们找到了一种方法可以把这个算法发成增量式的,也就是说我每天都把当天的数据计算好了后和前一天的报表合并,这样可以大大的节省计算时间,每天的数据计算量只需要20分钟,但是如果我要算整个月的,系统则需要10个小时以上(SQL语句在大数据量面前性能成级数性下降)。这种分而治之的思路在大数据面前对性能有很帮助,就像merge排序一样。SQL语句和数据库的性能优化也是这一策略,如:使用嵌套式的Select而不是笛卡尔积的Select,使用视图,等等。

4.2)代码调优。从我的经验上来说,代码上的调优有下面这几点:

  • 字符串操作。这是最费系统性能的事了,无论是strcpy, strcat还是strlen,最需要注意的是字符串子串匹配。所以,能用整型最好用整型。举几个例子,第一个例子是N年前做银行的时候,我的同事喜欢把日期存成字符串(如:2012-05-29 08:30:02),我勒个去,一个select  where between语句相当耗时。另一个例子是,我以前有个同事把一些状态码用字符串来处理,他的理由是,这样可以在界面上直接显示,后来性能调优的时候,我把这些状态码全改成整型,然后用位操作查状态,因为有一个每秒钟被调用了150K次的函数里面有三处需要检查状态,经过改善以后,整个系统的性能上升了30%左右。还有一个例子是,我以前从事的某个产品编程规范中有一条是要在每个函数中把函数名定义出来,如:const char fname[]=”functionName()”, 这是为了好打日志,但是为什么不声明成 static类型的呢?
  • 多线程调优。有人说,thread is evil,这个对于系统性能在某些时候是个问题。因为多线程瓶颈就在于互斥和同步的锁上,以及线程上下文切换的成本,怎么样的少用锁或不用锁是根本(比如:多版本并发控制(MVCC)在分布式系统中的应用 中说的乐观锁可以解决性能问题),此外,还有读写锁也可以解决大多数是读操作的并发的性能问题。这里多说一点在C++中,我们可能会使用线程安全的智能指针AutoPtr或是别的一些容器,只要是线程安全的,其不管三七二十一都要上锁,上锁是个成本很高的操作,使用AutoPtr会让我们的系统性能下降得很快,如果你可以保证不会有线程并发问题,那么你应该不要用AutoPtr。我记得我上次我们同事去掉智能指针的引用计数,让系统性能提升了50%以上。对于Java对象的引用计数,如果我猜的没错的话,到处都是锁,所以,Java的性能问题一直是个问题。另外,线程不是越多越好,线程间的调度和上下文切换也是很夸张的事,尽可能的在一个线程里干,尽可能的不要同步线程。这会让你有很多的性能。
  • 内存分配。不要小看程序的内存分配。malloc/realloc/calloc这样的系统调非常耗时,尤其是当内存出现碎片的时候。我以前的公司出过这样一个问题——在用户的站点上,我们的程序有一天不响应了,用GDB跟进去一看,系统hang在了malloc操作上,20秒都没有返回,重启一些系统就好了。这就是内存碎片的问题。这就是为什么很多人抱怨STL有严重的内存碎片的问题,因为太多的小内存的分配释放了。有很多人会以为用内存池可以解决这个问题,但是实际上他们只是重新发明了Runtime-C或操作系统的内存管理机制,完全于事无补。当然解决内存碎片的问题还是通过内存池,具体来说是一系列不同尺寸的内存池(这个留给大家自己去思考)。当然,少进行动态内存分配是最好的。说到内存池就需要说一下池化技术。比如线程池,连接池等。池化技术对于一些短作业来说(如http服务) 相当相当的有效。这项技术可以减少链接建立,线程创建的开销,从而提高性能。
  • 异步操作。我们知道Unix下的文件操作是有block和non-block的方式的,像有些系统调用也是block式的,如:Socket下的select,Windows下的WaitforObject之类的,如果我们的程序是同步操作,那么会非常影响性能,我们可以改成异步的,但是改成异步的方式会让你的程序变复杂。异步方式一般要通过队列,要注间队列的性能问题,另外,异步下的状态通知通常是个问题,比如消息事件通知方式,有callback方式,等,这些方式同样可能会影响你的性能。但是通常来说,异步操作会让性能的吞吐率有很大提升(Throughput),但是会牺牲系统的响应时间(latency)。这需要业务上支持。
  • 语言和代码库。我们要熟悉语言以及所使用的函数库或类库的性能。比如:STL中的很多容器分配了内存后,那怕你删除元素,内存也不会回收,其会造成内存泄露的假像,并可能造成内存碎片问题。再如,STL某些容器的size()==0  和 empty()是不一样的,因为,size()是O(n)复杂度,empty()是O(1)的复杂度,这个要小心。Java中的JVM调优需要使用的这些参数:-Xms -Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold,还需要注意JVM的GC,GC的霸气大家都知道,尤其是full GC(还整理内存碎片),他就像“恐龙特级克赛号”一样,他运行的时候,整个世界的时间都停止了。

4.3)网络调优

关于网络调优,尤其是TCP Tuning(你可以以这两个关键词在网上找到很多文章),这里面有很多很多东西可以说。看看Linux下TCP/IP的那么多参数就知道了(顺便说一下,你也许不喜欢Linux,但是你不能否认Linux给我们了很多可以进行内核调优的权力)。强烈建议大家看看《TCP/IP 详解 卷1:协议》这本书。我在这里只讲一些概念上的东西。

A) TCP调优

我们知道TCP链接是有很多开销的,一个是会占用文件描述符,另一个是会开缓存,一般来说一个系统可以支持的TCP链接数是有限的,我们需要清楚地认识到TCP链接对系统的开销是很大的。正是因为TCP是耗资源的,所以,很多攻击都是让你系统上出现大量的TCP链接,把你的系统资源耗尽。比如著名的SYNC Flood攻击。

所以,我们要注意配置KeepAlive参数,这个参数的意思是定义一个时间,如果链接上没有数据传输,系统会在这个时间发一个包,如果没有收到回应,那么TCP就认为链接断了,然后就会把链接关闭,这样可以回收系统资源开销。(注:HTTP层上也有KeepAlive参数)对于像HTTP这样的短链接,设置一个1-2分钟的keepalive非常重要。这可以在一定程度上防止DoS攻击。有下面几个参数(下面这些参数的值仅供参考):

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_fin_timeout = 30

对于TCP的TIME_WAIT这个状态,主动关闭的一方进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),默认为4分钟,TIME_WAIT状态下的资源不能回收。有大量的TIME_WAIT链接的情况一般是在HTTP服务器上。对此,有两个参数需要注意,

net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1

前者表示重用TIME_WAIT,后者表示回收TIME_WAIT的资源。

TCP还有一个重要的概念叫RWIN(TCP Receive Window Size),这个东西的意思是,我一个TCP链接在没有向Sender发出ack时可以接收到的最大的数据包。为什么这个很重要?因为如果Sender没有收到Receiver发过来ack,Sender就会停止发送数据并会等一段时间,如果超时,那么就会重传。这就是为什么TCP链接是可靠链接的原因。重传还不是最严重的,如果有丢包发生的话,TCP的带宽使用率会马上受到影响(会盲目减半),再丢包,再减半,然后如果不丢包了,就逐步恢复。相关参数如下:

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

一般来说,理论上的RWIN应该设置成:吞吐量  * 回路时间。Sender端的buffer应该和RWIN有一样的大小,因为Sender端发送完数据后要等Receiver端确认,如果网络延时很大,buffer过小了,确认的次数就会多,于是性能就不高,对网络的利用率也就不高了。也就是说,对于延迟大的网络,我们需要大的buffer,这样可以少一点ack,多一些数据,对于响应快一点的网络,可以少一些buffer。因为,如果有丢包(没有收到ack),buffer过大可能会有问题,因为这会让TCP重传所有的数据,反而影响网络性能。(当然,网络差的情况下,就别玩什么高性能了) 所以,高性能的网络重要的是要让网络丢包率非常非常地小(基本上是用在LAN里),如果网络基本是可信的,这样用大一点的buffer会有更好的网络传输性能(来来回回太多太影响性能了)。

另外,我们想一想,如果网络质量非常好,基本不丢包,而业务上我们不怕偶尔丢几个包,如果是这样的话,那么,我们为什么不用速度更快的UDP呢?你想过这个问题了吗?

B)UDP调优

说到UDP的调优,有一些事我想重点说一样,那就是MTU——最大传输单元(其实这对TCP也一样,因为这是链路层上的东西)。所谓最大传输单元,你可以想像成是公路上的公交车,假设一个公交车可以最多坐70人,带宽就像是公路的车道数一样,如果一条路上最多可以容下100辆公交车,那意味着我最多可以运送7000人,但是如果公交车坐不满,比如平均每辆车只有20人,那么我只运送了2000人,于是我公路资源(带宽资源)就被浪费了。 所以,我们对于一个UDP的包,我们要尽量地让他大到MTU的最大尺寸再往网络上传,这样可以最大化带宽利用率。对于这个MTU,以太网是1500字节,光纤是4352字节,802.11无线网是7981。但是,当我们用TCP/UDP发包的时候,我们的有效负载Payload要低于这个值,因为IP协议会加上20个字节,UDP会加上8个字节(TCP加的更多),所以,一般来说,你的一个UDP包的最大应该是1500-8-20=1472,这是你的数据的大小。当然,如果你用光纤的话, 这个值就可以更大一些。(顺便说一下,对于某些NB的千光以态网网卡来说,在网卡上,网卡硬件如果发现你的包的大小超过了MTU,其会帮你做fragment,到了目标端又会帮你做重组,这就不需要你在程序中处理了)

再多说一下,使用Socket编程的时候,你可以使用setsockopt() 设置 SO_SNDBUF/SO_RCVBUF 的大小,TTL和KeepAlive这些关键的设置,当然,还有很多,具体你可以查看一下Socket的手册。

最后说一点,UDP还有一个最大的好处是multi-cast多播,这个技术对于你需要在内网里通知多台结点时非常方便和高效。而且,多播这种技术对于机会的水平扩展(需要增加机器来侦听多播信息)也很有利。

C)网卡调优

对于网卡,我们也是可以调优的,这对于千兆以及网网卡非常必要,在Linux下,我们可以用ifconfig查看网上的统计信息,如果我们看到overrun上有数据,我们就可能需要调整一下txqueuelen的尺寸(一般默认为1000),我们可以调大一些,如:ifconfig eth0 txqueuelen 5000。Linux下还有一个命令叫:ethtool可以用于设置网卡的缓冲区大小。在Windows下,我们可以在网卡适配器中的高级选项卡中调整相关的参数(如:Receive Buffers, Transmit Buffer等,不同的网卡有不同的参数)。把Buffer调大对于需要大数据量的网络传输非常有效。

D)其它网络性能

关于多路复用技术,也就是用一个线程来管理所有的TCP链接,有三个系统调用要重点注意:一个是select,这个系统调用只支持上限1024个链接,第二个是poll,其可以突破1024的限制,但是select和poll本质上是使用的轮询机制,轮询机制在链接多的时候性能很差,因主是O(n)的算法,所以,epoll出现了,epoll是操作系统内核支持的,仅当在链接活跃时,操作系统才会callback,这是由操作系统通知触发的,但其只有Linux Kernel 2.6以后才支持(准确说是2.5.44中引入的),当然,如果所有的链接都是活跃的,过多的使用epoll_ctl可能会比轮询的方式还影响性能,不过影响的不大。

另外,关于一些和DNS Lookup的系统调用要小心,比如:gethostbyaddr/gethostbyname,这个函数可能会相当的费时,因为其要到网络上去找域名,因为DNS的递归查询,会导致严重超时,而又不能通过设置什么参数来设置time out,对此你可以通过配置hosts文件来加快速度,或是自己在内存中管理对应表,在程序启动时查好,而不要在运行时每次都查。另外,在多线程下面,gethostbyname会一个更严重的问题,就是如果有一个线程的gethostbyname发生阻塞,其它线程都会在gethostbyname处发生阻塞,这个比较变态,要小心。(你可以试试GNU的gethostbyname_r(),这个的性能要好一些) 这种到网上找信息的东西很多,比如,如果你的Linux使用了NIS,或是NFS,某些用户或文件相关的系统调用就很慢,所以要小心。

4.4)系统调优

A)I/O模型

前面说到过select/poll/epoll这三个系统调用,我们都知道,Unix/Linux下把所有的设备都当成文件来进行I/O,所以,那三个操作更应该算是I/O相关的系统调用。说到  I/O模型,这对于我们的I/O性能相当重要,我们知道,Unix/Linux经典的I/O方式是(关于Linux下的I/O模型,大家可以读一下这篇文章《使用异步I/O大大提高性能》):

第一种,同步阻塞式I/O,这个不说了。

第二种,同步无阻塞方式。其通过fctnl设置 O_NONBLOCK 来完成。

第三种,对于select/poll/epoll这三个是I/O不阻塞,但是在事件上阻塞,算是:I/O异步,事件同步的调用。

第四种,AIO方式。这种I/O 模型是一种处理与 I/O 并行的模型。I/O请求会立即返回,说明请求已经成功发起了。在后台完成I/O操作时,向应用程序发起通知,通知有两种方式:一种是产生一个信号,另一种是执行一个基于线程的回调函数来完成这次 I/O 处理过程。

第四种因为没有任何的阻塞,无论是I/O上,还是事件通知上,所以,其可以让你充分地利用CPU,比起第二种同步无阻塞好处就是,第二种要你一遍一遍地去轮询。Nginx之所所以高效,是其使用了epoll和AIO的方式来进行I/O的。

再说一下Windows下的I/O模型,

a)一个是WriteFile系统调用,这个系统调用可以是同步阻塞的,也可以是同步无阻塞的,关于看文件是不是以Overlapped打开的。关于同步无阻塞,需要设置其最后一个参数Overlapped,微软叫Overlapped I/O,你需要WaitForSingleObject才能知道有没有写完成。这个系统调用的性能可想而知。

b)另一个叫WriteFileEx的系统调用,其可以实现异步I/O,并可以让你传入一个callback函数,等I/O结束后回调之, 但是这个回调的过程Windows是把callback函数放到了APC(Asynchronous Procedure Calls)的队列中,然后,只用当应用程序当前线程成为可被通知状态(Alterable)时,才会被回调。只有当你的线程使用了这几个函数时WaitForSingleObjectExWaitForMultipleObjectsExMsgWaitForMultipleObjectsExSignalObjectAndWait 和 SleepEx,线程才会成为Alterable状态。可见,这个模型,还是有wait,所以性能也不高。

c)然后是IOCP – IO Completion Port,IOCP会把I/O的结果放在一个队列中,但是,侦听这个队列的不是主线程,而是专门来干这个事的一个或多个线程去干(老的平台要你自己创建线程,新的平台是你可以创建一个线程池)。IOCP是一个线程池模型。这个和Linux下的AIO模型比较相似,但是实现方式和使用方式完全不一样。

当然,真正提高I/O性能方式是把和外设的I/O的次数降到最低,最好没有,所以,对于读来说,内存cache通常可以从质上提升性能,因为内存比外设快太多了。对于写来说,cache住要写的数据,少写几次,但是cache带来的问题就是实时性的问题,也就是latency会变大,我们需要在写的次数上和相应上做权衡。

B)多核CPU调优

关于CPU的多核技术,我们知道,CPU0是很关键的,如果0号CPU被用得过狠的话,别的CPU性能也会下降,因为CPU0是有调整功能的,所以,我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。

  • 对于Windows来说,我们可以通过“任务管理器”中的“进程”而中右键菜单中的“设置相关性……”(Set Affinity…)来设置并限制这个进程能被运行在哪些核上。
  • 对于Linux来说,可以使用taskset命令来设置(你可以通过安装schedutils来安装这个命令:apt-get install schedutils)

多核CPU还有一个技术叫NUMA技术(Non-Uniform Memory Access)。传统的多核运算是使用SMP(Symmetric Multi-Processor )模式,多个处理器共享一个集中的存储器和I/O总线。于是就会出现一致存储器访问的问题,一致性通常意味着性能问题。NUMA模式下,处理器被划分成多个node, 每个node有自己的本地存储器空间。关于NUMA的一些技术细节,你可以查看一下这篇文章《Linux 的 NUMA 技术》,在Linux下,对NUMA调优的命令是:numactl 。如下面的命令:(指定命令“myprogram arg1 arg2”运行在node 0 上,其内存分配在node 0 和 1上)

numactl --cpubind=0 --membind=0,1 myprogram arg1 arg2

当然,上面这个命令并不好,因为内存跨越了两个node,这非常不好。最好的方式是只让程序访问和自己运行一样的node,如:

$ numactl --membind 1 --cpunodebind 1 --localalloc myapplication

C)文件系统调优

关于文件系统,因为文件系统也是有cache的,所以,为了让文件系统有最大的性能。首要的事情就是分配足够大的内存,这个非常关键,在Linux下可以使用free命令来查看 free/used/buffers/cached,理想来说,buffers和cached应该有40%左右。然后是一个快速的硬盘控制器,SCSI会好很多。最快的是Intel SSD 固态硬盘,速度超快,但是写次数有限。

接下来,我们就可以调优文件系统配置了,对于Linux的Ext3/4来说,几乎在所有情况下都有所帮助的一个参数是关闭文件系统访问时间,在/etc/fstab下看看你的文件系统 有没有noatime参数(一般来说应该有),还有一个是dealloc,它可以让系统在最后时刻决定写入文件发生时使用哪个块,可优化这个写入程序。还要注间一下三种日志模式:data=journal、data=ordered和data=writeback。默认设置data=ordered提供性能和防护之间的最佳平衡。

当然,对于这些来说,ext4的默认设置基本上是最佳优化了。

这里介绍一个Linux下的查看I/O的命令—— iotop,可以让你看到各进程的磁盘读写的负载情况。

其它还有一些关于NFS、XFS的调优,大家可以上google搜索一些相关优化的文章看看。关于各文件系统,大家可以看一下这篇文章——《Linux日志文件系统及性能分析

4.5)数据库调优

数据库调优并不是我的强项,我就仅用我非常有限的知识说上一些吧。注意,下面的这些东西并不一定正确,因为在不同的业务场景,不同的数据库设计下可能会得到完全相反的结论,所以,我仅在这里做一些一般性的说明,具体问题还要具体分析。

A)数据库引擎调优

我对数据库引擎不是熟,但是有几个事情我觉得是一定要去了解的。

  • 数据库的锁的方式。这个非常非常地重要。并发情况下,锁是非常非常影响性能的。各种隔离级别,行锁,表锁,页锁,读写锁,事务锁,以及各种写优先还是读优先机制。性能最高的是不要锁,所以,分库分表,冗余数据,减少一致性事务处理,可以有效地提高性能。NoSQL就是牺牲了一致性和事务处理,并冗余数据,从而达到了分布式和高性能。
  • 数据库的存储机制。不但要搞清楚各种类型字段是怎么存储的,更重要的是数据库的数据存储方式,是怎么分区的,是怎么管理的,比如Oracle的数据文件,表空间,段,等等。了解清楚这个机制可以减轻很多的I/O负载。比如:MySQL下使用show engines;可以看到各种存储引擎的支持。不同的存储引擎有不同的侧重点,针对不同的业务或数据库设计会让你有不同的性能。
  • 数据库的分布式策略。最简单的就是复制或镜像,需要了解分布式的一致性算法,或是主主同步,主从同步。通过了解这种技术的机理可以做到数据库级别的水平扩展。

B)SQL语句优化

关于SQL语句的优化,首先也是要使用工具,比如:MySQL SQL Query AnalyzerOracle SQL Performance Analyzer,或是微软SQL Query Analyzer,基本上来说,所有的RMDB都会有这样的工具,来让你查看你的应用中的SQL的性能问题。 还可以使用explain来看看SQL语句最终Execution Plan会是什么样的。

还有一点很重要,数据库的各种操作需要大量的内存,所以服务器的内存要够,优其应对那些多表查询的SQL语句,那是相当的耗内存。

下面我根据我有限的数据库SQL的知识说几个会有性能问题的SQL:

  • 全表检索。比如:select * from user where lastname = “xxxx”,这样的SQL语句基本上是全表查找,线性复杂度O(n),记录数越多,性能也越差(如:100条记录的查找要50ms,一百万条记录需要5分钟)。对于这种情况,我们可以有两种方法提高性能:一种方法是分表,把记录数降下来,另一种方法是建索引(为lastname建索引)。索引就像是key-value的数据结构一样,key就是where后面的字段,value就是物理行号,对索引的搜索复杂度是基本上是O(log(n)) ——用B-Tree实现索引(如:100条记录的查找要50ms,一百万条记录需要100ms)。
  • 索引。对于索引字段,最好不要在字段上做计算、类型转换、函数、空值判断、字段连接操作,这些操作都会破坏索引原本的性能。当然,索引一般都出现在Where或是Order by字句中,所以对Where和Order by子句中的子段最好不要进行计算操作,或是加上什么NOT之类的,或是使用什么函数。
  • 多表查询。关系型数据库最多的操作就是多表查询,多表查询主要有三个关键字,EXISTS,IN和JOIN(关于各种join,可以参看图解SQL的Join一文)。基本来说,现代的数据引擎对SQL语句优化得都挺好的,JOIN和IN/EXISTS在结果上有些不同,但性能基本上都差不多。有人说,EXISTS的性能要好于IN,IN的性能要好于JOIN,我各人觉得,这个还要看你的数据、schema和SQL语句的复杂度,对于一般的简单的情况来说,都差不多,所以千万不要使用过多的嵌套,千万不要让你的SQL太复杂,宁可使用几个简单的SQL也不要使用一个巨大无比的嵌套N级的SQL。还有人说,如果两个表的数据量差不多,Exists的性能可能会高于In,In可能会高于Join,如果这两个表一大一小,那么子查询中,Exists用大表,In则用小表。这个,我没有验证过,放在这里让大家讨论吧。另,有一篇关于SQL Server的文章大家可以看看《IN vs JOIN vs EXISTS
  • JOIN操作。有人说,Join表的顺序会影响性能,只要Join的结果集是一样,性能和join的次序无关。因为后台的数据库引擎会帮我们优化的。Join有三种实现算法,嵌套循环,排序归并,和Hash式的Join。(MySQL只支持第一种)
    • 嵌套循环,就好像是我们常见的多重嵌套循环。注意,前面的索引说过,数据库的索引查找算法用的是B-Tree,这是O(log(n))的算法,所以,整个算法复法度应该是O(log(n)) * O(log(m)) 这样的。
    • Hash式的Join,主要解决嵌套循环的O(log(n))的复杂,使用一个临时的hash表来标记。
    • 排序归并,意思是两个表按照查询字段排好序,然后再合并。当然,索引字段一般是排好序的。

还是那句话,具体要看什么样的数据,什么样的SQL语句,你才知道用哪种方法是最好的。

  • 部分结果集。我们知道MySQL里的Limit关键字,Oracle里的rownum,SQL Server里的Top都是在限制前几条的返回结果。这给了我们数据库引擎很多可以调优的空间。一般来说,返回top n的记录数据需要我们使用order by,注意在这里我们需要为order by的字段建立索引。有了被建索引的order by后,会让我们的select语句的性能不会被记录数的所影响。使用这个技术,一般来说我们前台会以分页方式来显现数据,Mysql用的是OFFSET,SQL Server用的是FETCH NEXT,这种Fetch的方式其实并不好是线性复杂度,所以,如果我们能够知道order by字段的第二页的起始值,我们就可以在where语句里直接使用>=的表达式来select,这种技术叫seek,而不是fetch,seek的性能比fetch要高很多。
  • 字符串。正如我前面所说的,字符串操作对性能上有非常大的恶梦,所以,能用数据的情况就用数字,比如:时间,工号,等。
  • 全文检索。千万不要用Like之类的东西来做全文检索,如果要玩全文检索,可以尝试使用Sphinx
  • 其它

    • 不要select *,而是明确指出各个字段,如果有多个表,一定要在字段名前加上表名,不要让引擎去算。
    • 不要用Having,因为其要遍历所有的记录。性能差得不能再差。
    • 尽可能地使用UNION ALL  取代  UNION。
    • 索引过多,insert和delete就会越慢。而update如果update多数索引,也会慢,但是如果只update一个,则只会影响一个索引表。
    • 等等。

关于SQL语句的优化,网上有很多文章, 不同的数据库引擎有不同的优化技巧,正如本站以前转发的《MySQL性能优化的最佳20+条经验

先写这么多吧,欢迎大家指正补充。

注:这篇文章的确是个大杂烩。其实其中的说到的很多技术在网上都有很多很多的技术文章,google一下就能找到一堆有很多细节的文章,所以我也就不写了。这篇性能调优的文章写作的动机是之前看到 @淘宝褚霸 强推的highscalability.com上的这篇文章:Big List Of 20 Common Bottlenecks,觉得这篇文章泛泛而谈,觉得自己能写得比它好,所以就产生了动机。

转载时请注明作者和出处,请勿用于商业用途

您可能也喜欢:

MySQL性能优化的最佳20+条经验

TCP注册端口号大全

TCP网络关闭的状态变换时序图

程序员技术练级攻略

6个有用的MySQL语句

无觅

相关文章

via 酷壳 – CoolShell.cn http://coolshell.cn/articles/7490.html

【转】安装MinGW和MSYS

今天和一位朋友聊天,了解到他现在win平台用eclipse来学习编程,于是我也打算安装一个试 试。google了之后发现在win平台上用eclipse开发c/c++程序需要c/c++编译器,而一般大家会安装mingw,当然也可以安装 cygwin,不过cygwin的安装包相对来说大很多,而mingw的软件包加起来总共也就只有20多m。

本来是不需要来介绍如何安装mingw的,因为安装方式很傻瓜,通过网络安装,根据提示一步一步往下设置就可以了,但我发现网络安装的速度实在不敢 恭维,几kb/s甚至0.xx kb/s的速度去下载一个9mb多的软件包实在太折磨人了。于是,我找到了一个既傻瓜又快速的安装方法,如下:

我下载的mingw安装程序为MinGW-5.1.3.exe,第一次打开之后它会产生一个mingw.ini配置文件,里面是相关版本的软件包信息,三个组合包:current、previous、candidate,我打算安装candidate版本的,下面分别是相应的软件包信息:

binutils=binutils-2.17.50-20060824-1.tar.gz|21940
core=gcc-core-3.4.5-20060117-1.tar.gz|8644
gpp=gcc-g++-3.4.5-20060117-1.tar.gz|16140
g77=gcc-g77-3.4.5-20060117-1.tar.gz|5161
ada=gcc-ada-3.4.5-20060117-1.tar.gz|33352
java=gcc-java-3.4.5-20060117-1.tar.gz|46767
objc=gcc-objc-3.4.5-20060117-1.tar.gz|4559
make=mingw32-make-3.81-2.tar.gz|720

那么我现在只需要去http://prdownloads.sourceforge.net/mingw下载上述软件包中我需要的包即可。用flashget或者thunder下载起来,速度可就快多了。把下载的软件包和MinGW-5.1.3.exe放在同一目录,再双击打开它,就可以顺利的安装完mingw了。

如果你喜欢动手,还可以这样来安装mingw:

下载的文件可以用WinRAR解开。接着操作如下:

1. 建立文件夹C:MinGW    (假设你把mingw安装在C盘根目录)

2. 解压binutils-2.17.50-20060824-1.tar.gz到这个文件夹,并在控制台中执行下面的命令:

cd info

ren dir dir.binutils

3. 解压gcc-core-3.4.5-20060117-1.tar.gz到这个文件夹,并在控制台中执行下面的命令:

copy dir dir.gcc

copy dir+dir.binutils

4. 解压gcc-g++-3.4.5-20060117-1.tar.gz到*MinGW

5. 解压mingw-runtime-3.10.tar.gz到*MinGW

6.解压w32api-3.7.tar.gz到*MinGW,在控制台中执行:

ren dir dir.gcc.binutils

7.解压mingw32-make-3.81-1.tar.gz到*MinGW,在控制台中执行:

copy dir+dir.gcc.binutils

更多细节可以参看这里:http://www.mingw.org/MinGWiki/index.php/Install%20MinGW

你如果需要增加其他语言的编译支持,也是同样的方法安装相应的包。

接下来要做两个设置:

1.拷贝一份MinGWbin下的mingw32-make.exe改名为make.exe,同样是放在MinGWbin下面。

2.设置windows系统的环境变量,编辑Path变量,在变量值的最前面添加“C:MinGWbin;”,这是为了防止和VC/.NET之类的make命令冲突。

接下来安装MSYS,你只要下载下面两个包就可以了:MSYS-1.0.10.exemsysDTK-1.0.1.exe

安装MSYS-1.0.10时,接受所有默认的选项,或者依照个人习惯设置,安装到最后会出现一个DOS窗口:

输入 y ,回车继续;

接着窗口中会出现:

Do you have MinGW installed? [yn ] 当然是选择 y

下面程序会询问的安装路径:

Please answer the following in the form of c:msys

Where is your MinGW installation?

输入C:MinGW (你如果安装在其他路径就输入相应的路径)。

之后写一篇关于Eclipse的安装的日志.

Ubuntu开启root用户及其它登录问题的解决【转】

Ubuntu安装后,root 用户默认是被锁定了的,不允许登录,也不允许“su”到 root。有人说这是个不好的实践,特别是对于服务器来说。我觉得对于桌面用户来说,这样安全性更高一些,是应该的;但对于服务器可以设置成“允许 su 到root,但不允许root用户直接登录”。而我为了开发时的方便,则在桌面和服务器上都采用这种方式。

允许 su 到 root

非常简单,下面是设置的方法:

me@tipfoo:~$ sudo passwd

Password: <— 输入安装时那个用户的密码

Enter new UNIX password: <— 新的Root用户密码

Retype new UNIX password: <— 重复新的Root用户密码

passwd:已成功更新密码

允许root登录

如果要允许root登录(不推荐),则这样操作:

me@tipfoo:~$ gksu /usr/sbin/gdmsetup

(或者使用桌面菜单:系统>系统管理>登录窗口)

点“安全”选项页,选择“允许本地管理员登录”。

注:这一步依赖上一步

不输入密码直接登录

在论坛上也看见有人抱怨,家中的Ubuntu不能像Window$那样──不用输入密码就能登录。其实同样能做到:

就在上一步的“安全”选项页中,勾选:

“启用自动登录”,“用户”选择(如:“me”);

注意:公共用的计算机千万不能这么设置!

SSH登录远程服务器

如果远程服务器只允许root用户SSH到服务器时,在Ubuntu下,必须“su 到root”用户才能登录成功(具体是看服务器端的配置)。

首先,复制密钥到“/root/.ssh/”目录,

me@tipfoo:~$ su

Password:

root@tipfoo:/home/me# chmod 600 -R /root/.ssh/

root@tipfoo:/home/me# ssh -p 27482 11.22.33.44

Enter passphrase for key ‘/root/.ssh/id_rsa’:

Last login: Thu Jun 21 14:29:00 2007 from 11.22.33.45

Ubuntu和它的衍生版,还有其他【转】

Ubuntu是最近最火热的Linux发行版了,GNU/Linux众多 的发行版已经让普通用户们找不到北了,但是开发者们依旧乐此不疲,一个发行版接着一个发行版。从产品的推广上看,这样做无疑是没有好处的,但是, Linux本身并不是某一个公司的专属物,百花齐放的发行版才是开源特色。

我收集有数量不少的LiveCD,这是我入门的第一步,也安装过不少版本了,不幸的是,我依然没有找到北。我也一直在奇怪,在国内Linux类书籍里最有名的红帽子系列我一个也没有装过,哈哈。

我的第一张LiveCD应该是 fanx ,这个由 www.linuxfans.org 社区爱好者制作的小东西,第一次让我感觉到了原来系统还可以这样玩,第一次运行的时候我甚至不会退出,从那以后,我开始收集各类LiveCD,现在依然有不少,感谢把机器借给我测试的MM,你好可爱!

第一真正意义上安装到硬盘的发行版是Magic Linux,偷偷从硬盘里分出了20G,用来装系统了。这个时候知道了什么是KDE,什么是GNOME,后知后觉啊。

上面的都是废话,下面进入主题
1、 ubuntu
使用的是Gnome环境,外观圆润,是我比较喜欢的,理论上,没有什么版权问题,这是ubuntu的主打版本。
2、 kubuntu
有人喜欢Gnome,就一定有人喜欢KDE,这个就是使用KDE环境的,KDE使用的是QT开发,版权问题一直为一些开源人士诟病,不过欧洲的厂商一直在 坚持使用,现在QT库似乎有了free版,以后发展也许会更好吧,说起这个我就不得不说EVA,这个Linux下的QQ客户端,还是可以用用的,至少比 pidgin时不时不能上QQ好一点。
3、 edubuntu
看名字就知道了,这个是用来教育的,适合小朋友使用,天啊,外国的小朋友都在学习Linux了,有一些教育软件,界面更加可爱。
4、 xubuntu
使用的是 Xfce ,占用资源较小,适合老机子使用,也是我正在使用的版本,这只小老鼠还是很好用的。
5、 gobuntu
总有一些用户对开源是极度钟情的,这个版本其实就是ubuntu,但是它所提供的软件,全部是free的,血统真纯。

以上是ubuntu.com维护的版本,已经不少了,但是也正如我前面所说的,百花齐放才是开源的特质。很多热心的用户还在利用ubuntu衍生出其他版本。
1、 Mythbuntu
Mythbuntu,是一套基于Ubuntu的面向媒体中心电脑的发行版.MythTV是其中最重要的组成之一,用于实现媒体中心等功能。本文写作时,7.10版本发行了,改用了Xfce。
2、 Fluxbuntu
Fluxbuntu是一款基于轻便的Fluxbox窗口管理器的一个Ubuntu衍生发行版。据我了解,这个占用资源是最小了,中文支持也不错,300MB出头的iso文件。
3、eeeXubuntu
华硕的EEEPC热卖,有爱好者就推出了专供它使用的ubuntu。
4、gOS
gOS 是专为199美元Everex Green PC TC2502 PC构建的操作系统,它基于Ubuntu Linux 7.1构建,最大的亮点在于它是一个为Google系列服务量身定制的系统。Google粉丝绝对不能错过。
5、Ubuntu Studio
Ubuntu Studio 是一个主要为音频、视频以及图形爱好者而准备的 Ubuntu 非官方衍生版本。Ubuntu Studio 从大量的开源多媒体创作程序中精挑细选,然后把最好的奉献给大家。比如,在音频方面,UbuntuStudio 选择了 Ardour 2 这个支持多轨录制/编辑的程序;在视频方面,Ubuntu Studio 中包含了PiTiVi、Kino、Cinepaint 等程序;在图形方面,Ubuntu Studio 囊括了 GIMP、Inkscape、Blender等优秀软件。相信使用这些软件将有助于实现你的精彩创意。本文最后修改时,这个衍生版发布的是7.10

一定还有其他的ubuntu衍生版是我不知道的,你知道吗?告诉我吧!

http://www.luweiqing.com/article/230/ubuntu

附上几个ubuntu的iso下载点:
http://tw.releases.ubuntu.com/
http://cdimage.ubuntu.com/

Fedora 9 正式版终于发布了【转自cnbeta】

感想:终于发了,跳了半个月了………

Fedora 是基于 Linux 的操作系统,包含了自由和开源软件最新的成果。Fedora 允许所有人自由使用、修改和重新发布。它由遍布全球的贡献者合作开发,他们构成了 Fedora 项目社区。Fedora 项目对所有人都是开放的。 Fedora 项目是助你推动自由、开放的软件和内容进步的领跑者。

下载地址:

安装介质

  • BitTorrent 下载
  • i386 – 安装 DVD
  • x86_64 – 安装 DVD
  • ppc – 安装 DVD
  • 直接下载
  • i386 – 安装 DVD
  • x86_64 – 安装 DVD
  • ppc – 安装 DVD
  • Jigdo
  • i386
  • x86_64
  • ppc
  • Fedora 桌面 Live 介质

  • BitTorrent 下载
  • i686 – Live CD
  • x86_64 – Live DVD ${Markup(_(‘ppc’))} – ${Markup(_(‘Live DVD’))}
  • –>

  • 直接下载
  • i686 – Live CD
  • x86_64 – Live DVD ${Markup(_(‘ppc’))} – ${Markup(_(‘Live DVD’))}
  • –> Fedora KDE Live 介质

  • BitTorrent 下载
  • i686 – Live CD
  • x86_64 – Live DVD
  • 直接下载
  • i686 – Live CD
  • x86_64 – Live DVD
  • [多图]用 Wubi 安装 Ubuntu 8.04 只需五步【转】

    感想:本来我还在犹豫是不是要装8.04试试,既然可以完美卸载装一下也无妨哈!

    大家好!我是silencer,最近有很多人在问wubi的情况,用为了使菜菜们快速掌握用wubi安装Ubuntu的方法,特将自己用wubi安 装 的经验跟大家一起分享。请高手不要笑话,也请帮忙看下我写的是否有问题,以帮助更多的新人更好的在wubi下面使用好Ubuntu.

    如 果你见过 Ubuntu 8.04 那炫目的3D特效,如果说听说过 Ubuntu 自由共享互助的精神,如果你想尝试一下但是却害怕复杂的操作或者影响你娇贵的Windows的话,Wubi很适合你。如同Live CD 一样,Wubi 不会给你的Xp带来任何改变,但是不同的是它提供完整的硬件接入,你还可以如同 Ubuntu 中下载、安装和使用应用程序。Wubi会把大部分文件储存在Windows下的一个文件夹内,你可以随时卸载它们。


    什么是 Wubi
    Wubi 是 Windows based Ubuntu Installer 缩写,是一个专门针对Windows用户的Ubuntu安装工具.


    Wubi 有哪些特点
    Wubi让你如同Windows操作系统里的其他软件一样安装卸载Ubuntu,你需要做的只是点击几下鼠标而已。在整个安装过程中用户不需要关心分区的设置,不需要修改启动文件。大大地降低了安装 Ubuntu Linux 的难度.

    用 Wubi 来安装 Ubuntu 8.04 的步骤
    第一步: (不会分区的菜菜们这一步就可以跳过)这样做只是为了方便管理文件,不另外分区也可以完成安装的!首先 我们可以用分区工具分出一个10G(大小根据你自己的实际情况而定)的盘出来,笔者用的是Norton PartitionMagic 8.0 ,分好后的盘如图 。 最好使用fat32格式分区安装,成功率要高很多。

    第二步: 到 官网下载 Wubi 以及 Ubuntu 8.04 的镜像文件,建议下载32位的 Ubuntu 8.04 镜像文件(32位的系统可用软件更多). 下载完后将 wubi 和 Ubuntu 8.04 的镜像文件放在同一个分区的根目录下,这样我们就要开始安装了。相信菜菜们很激动了吧!

    下载地址:

    http://cn.releases.ubuntu.com/8.04/ubuntu-8.04-desktop-i386.iso
    http://cn.releases.ubuntu.com/8.04/wubi.exe

    第三步: 找到我们刚才下的wubi,双击运行 Wubi.exe.

    这个就是Wubi

    在此选择你要的将 Ubuntu 安装在磁盘的哪一个分区上,给Ubuntu 分配空间的大小,设置语言环境以及设定你的用户名和登陆密码,这些你可以根据自己的实际情况来设置,然后点安装.

    wubi程序自动开始安装,wubi会自动找到你下的镜像文件,务必确定你的计算机连接在网络上,因为还需要在网上下载少量安装所需的文件,所以要保持网络连接.但是下载的很少,大多数文件在光盘映像中。中间的过程都是自动,笔者就不多说了!

    第四步:稍后,wubi会提示你需要重启计算机

    重启计算机后在启动菜单中选择 ubuntu 。进入 Ubuntu 后才真正开始安装,都是自动的而大家只需耐心的等待。大约二十分钟后就安装好了,机器会自动重启。

    第五步.再次开机在启动菜单中选择 ubuntu 进入,在登陆界面出现后输入你预设的用户名和密码后,如果显卡驱动无问题就可以了,到这里我相信可爱的ubuntu界面已经出现在你的眼前了吧!祝贺一下!

    笔 者的体会:8.04果然要漂亮些,特别是对中文字体的支持看起来比7.10要好的多!Wubi并不会牺牲ubuntu的性能,8.04刚刚发布, 对于喜欢ubuntu的朋友来说又是一个惊喜,特别是对A卡的支持更好,开3D特效不需要在进行复杂的驱动安装了!笔者的A卡(HD2400的)也玩起了 3D,以前在7.10装了很久都没装好,在8.04里只需在受限驱动里就可以将显卡驱动下下来装好,就行了,真的是太爽了。一切都是那么的自然,wubi 为我们菜菜们想的太周到了,连复杂的分区都省了,没有了分区的烦恼,对菜鸟来说是个好的玩ubuntu的方法,不会硬盘安装的、怕弄坏硬盘的,wubi是 个不错的选择哦!

    本文是由OwnLinux.cn原创团队成员silencer撰写
    OwnLinux.cn —发布Linux/Ubuntu最新资讯,提供Linux/Ubuntu入门使用指南,帮助Linux新手快速提高.

    官方正式发布 Ubuntu 8.04 Hardy Heron【转】

    感想:发了!发了!不过总感觉改进不大,我实际上是在等可以使用无线网卡和管理多个连接的linux,虽然fedora快来了,不过红帽子也快放弃fedora了,以后还是的用ubuntu呀……

    经过一天的漫长等待,Ubuntu 8.04 Hardy Heron 正式版 已经可以下载了, 之前.pool目录下已经有了最新版的Ubuntu 8.04 Hardy Heron的ISO文件,目前官方已经正式开放了 Ubuntu 8.04 正式版的ISO文件下载服务.

    目前国内用户访问官方的网站提供下的页面已经非常拥挤了,要下载ISO文件的朋友请 赶快下载吧,不然再过一段时间会更拥挤!今天涌入的巨大的访问量 也是对各个地区的官方服务器一个严峻的考验.同时,也看到这次 Ubuntu 发布新版本关注度的高涨,Ubuntu这几年发展的确很太快了!

    Ubuntu 8.04 Hardy Heron 正式版下载地址:

    http://releases.ubuntu.com/releases/8.04/
    http://tw.releases.ubuntu.com/8.04/

    友情提示:目前英文官方网站的速度很慢,建议用台湾的ISO下载服务器下载

    OwnLinux.cn —发布Linux/Ubuntu最新资讯,提供Linux/Ubuntu入门使用指南,帮助Linux新手快速提高.

    It‘s a funny training!

    “Ubuntu Desktop Training” I think it is very funny. As a Desktop Operation System easy to use is a very important property. So they don’t need a training like this.The training is as the “windows vista Training” for someone can not use the Internet! It’s funny!

    随着Ubuntu操作系统在桌面领域日趋流行,它背后的赞助公司:Canonical,正开始提供丰富的服务和支持.

    近日,Canonical公司正式宣布了“Ubuntu Desktop Training”,旨在为新手提供桌面相关的培训服务.“Ubuntu Desktop Training”是一套网络学习课程,专门面向桌面领域的新手.培训对象不需要预先学习与Linux相关的知识,仅需要相关计算机知识即可.这对于从Windows转向Linux的用户来说,是最合适不过了.

    Canonical建议在学习这个课程时,将Ubuntu 7.10安装在电脑硬盘上,这样效果会更好。

    那么,通过“Ubuntu Desktop Training”,我们可以学会什么呢?请看:

    • 理解“开源”的概念和与Ubuntu的联系。
    • 自定义Ubuntu桌面的外观和视觉。
    • 浏览文件系统和搜索文件。
    • 连接并使用互联网。
    • 使用OpenOffice.org来进行字处理和电子表格处理。
    • 安装和运行游戏。
    • 安装、删除和升级应用程序。
    • 查看、绘制、操作和扫描图像。
    • 播放、编辑和组织音乐和视频文件。
    • 在Ubuntu的免费和商业途径上寻找帮助。
    • 创建分区和双启动选项。

    可以看到,该培训的内容非常详尽,相信一个从未接触过Linux的新手,在经过培训以后,将会很好的使用Ubuntu来作为日常桌面工作。

    作为一个商业公司,这个培训是收费的,官方的价格是100$,不过在Canonical的Shop站点上,目前的价格是:59.15$:

    Ubuntu Desktop Course (elearning)

    Canonical公司适时推出Ubuntu桌面的相关培训,让我们看到了Ubuntu的成长和流行,也将对未来Ubuntu的发展和普及起到重要作用。

    LDCN供稿,LDCN(即LinuxDesktop.cn的缩写),中文名──“Linux桌面中文网”,是一个由在校大学生发起的,旨在让所有Linuxer一起参与、更新的Linux资讯、应用互动型社区站点.