PHP 持久连接于并发

有这么一种需求:
一次请求中需要访问相同的mc多次,如果串行来做的话,花费时间很长,如果多次mc连接能同时执行的话,花费时间将接近于一次连接的时间。
我不行每次请求都重新连接mc,希望使用PHP的长连接机制。

问题:
如果使用PHP的长连接,则同一次请求中的多次连接将很难实现,因为第二次pconnect返回的连接不是一条新的连接(不管是pfsockopen、mysql_pconnect 都是如此),所以,我将无法创建多个连接;
如果不使用长连接,则每次请求连接多次mc也是不小的开销。
如果真的能通过长连接来实现,则如果某一次请求需要20个连接,但是这种情况很少见,一般可能只有5个,于是我就要因为这一次请求,在一段时间内多维持15个长连接,确实不是一件愿意接受的事情,于是,我可能采用每个请求最多允许5个连接的方式,如果需要20次访问mc,则平均每个连接访问4次,就是说一半来讲,速度是纯串行的5倍

结论:
PHP长连接和多次连接是没法和平共处的,要想同时多个到相同host:port的连接,其中最多只能有一个长连接

相关知识:
PHP的mysql模块中有一个mysql.max_persistent的配置,就是长连接的最大个数,开始以为到同一个host:port可以有多个长连接,但是怎么也想不通,看了源码才知道,到同一个host:port只能有一个长连接,这里限制的是对不同的host:port产生的长连接

对于fsockopen打开的长连接是没有明确的个数限制的。

关于mysql prepare的用法

从MySQL 5.0 开始,
支持了一个全新的SQL句法:

PREPARE stmt_name FROM preparable_stmt;

EXECUTE stmt_name [USING @var_name [, @var_name] …];

{DEALLOCATE | DROP} PREPARE stmt_name;

 

通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!
同时也可以防止注入式攻击!

为了有一个感性的认识,
下面先给几个小例子:

mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;

Mysql 的执行计划

mysql的执行计划:
explain
显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上explain就可以了:
如:explain select * from test1
EXPLAIN
列的解释:

table
:显示这一行的数据是关于哪张表的
type
:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为consteq_regrefrangeindexheALL
possible_keys
:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key
实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEXindexname)来强制使用一个索引或者用IGNORE INDEXindexname)来强制MYSQL忽略索引
key_len
:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref
:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows
MYSQL认为必须检查的用来返回请求数据的行数
Extra
:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporaryUsing filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
extra
列返回的描述的意义
Distinct:
一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not exists: MYSQL
优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
Range checked for each Record
index map:#:没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort:
看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
Using index:
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
Using temporary
看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY
Where used
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALLindex,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
system
表只有一行:system表。这是const连接类型的特殊情况
const:
表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
eq_ref:
在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
ref:
这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少越少越好
range:
这个连接类型使用索引返回一个范围中的行,比如使用><查找东西时发生的情况
index:
这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
ALL:
这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

如何写PHP扩展

作者:老王

PHP扩展的生成框架(ext_skel)已经很方便了,今天我发现一个选项可以让开发过程更方便。

./ext_skel –help

./ext_skel –extname=module [–proto=file] [–stubs=file] [–xml[=file]]
[–skel=dir] [–full-xml] [–no-help]

  –extname=module   module is the name of your extension
–proto=file       file contains prototypes of functions to create
  –stubs=file       generate only function stubs in file
–xml              generate xml documentation to be added to phpdoc-cvs
–skel=dir         path to the skeleton directory
–full-xml         generate xml documentation for a self-contained extension
(not yet implemented)
–no-help          don’t try to be nice and create comments in the code
and helper functions to test if the module compiled

首先,编写一个proto文件:

vi foo.proto

内容如下(注意行尾没有分号):

int fun_a(string str_a, string str_b)
int fun_b(int int_a, int int_b)

软后生成扩展:

./ext_skel –extname=foo –proto=foo.proto

然后看看生成的文件:

vi php_foo.h

你会发现相应的内容已经被自动添加了:

PHP_FUNCTION(confirm_foo_compiled); /* For testing, remove later. */
PHP_FUNCTION(fun_a);
PHP_FUNCTION(fun_b);

vi foo.c

/* {{{ foo_functions[]
*
* Every user visible function must have an entry in foo_functions[].
*/
zend_function_entry foo_functions[] = {
PHP_FE(confirm_foo_compiled,    NULL)       /* For testing, remove later. */
PHP_FE(fun_a,   NULL)
PHP_FE(fun_b,   NULL)
{NULL, NULL, NULL}  /* Must be the last line in foo_functions[] */
};

/* {{{ proto int fun_a(string str_a, string str_b)
*/
PHP_FUNCTION(fun_a)
{
char *str_a = NULL;
char *str_b = NULL;
int argc = ZEND_NUM_ARGS();
int str_a_len;
int str_b_len;

    if (zend_parse_parameters(argc TSRMLS_CC, "ss", &str_a, &str_a_len, &str_b, &str_b_len) == FAILURE)
return;

    php_error(E_WARNING, "fun_a: not yet implemented");
}
/* }}} */

/* {{{ proto int fun_b(int int_a, int int_b)
*/
PHP_FUNCTION(fun_b)
{
int argc = ZEND_NUM_ARGS();
long int_a;
long int_b;

    if (zend_parse_parameters(argc TSRMLS_CC, "ll", &int_a, &int_b) == FAILURE)
return;

    php_error(E_WARNING, "fun_b: not yet implemented");
}
/* }}} */

可以看到,相应的代码都已经自动加上了。

如果我们在foo.proto里加入

int fun_c(resource res_a, array arr_b[, int int_c])

那么:

/* {{{ proto int fun_c(resource res_a, array arr_b [, int int_c])
*/
PHP_FUNCTION(fun_c)
{
int argc = ZEND_NUM_ARGS();
int res_a_id = -1;
long int_c;
zval *res_a = NULL;
zval *arr_b = NULL;

    if (zend_parse_parameters(argc TSRMLS_CC, "ra|l", &res_a, &arr_b, &int_c) == FAILURE)
return;

    if (res_a) {
ZEND_FETCH_RESOURCE(???, ???, res_a, res_a_id, "???", ???_rsrc_id);
}

    php_error(E_WARNING, "fun_c: not yet implemented");
}
/* }}} */

可以看到,可选参数也判断出来了,很智能。

转自:   转自: http://hi.baidu.com/thinkinginlamp/blog/item/7c691f3030084099a9018e1b.html

参考资料(推荐):

http://talks.php.net/show/extending-php-apachecon2003/

http://blog.csdn.net/taft/archive/2006/02/10/596291.aspx

扩展示例: http://hi.baidu.com/icej/blog/item/d624d4fdbdeefb4ed7887d86.html

大型网站架构设计

1、  数据结构和产品架构设计,这是基础!

2、  角色分开,各司其职(web服务器,缓存服务器,负载平衡,数据库等)

3、  HTML静态化(用缓存服务器也可)

4、  图片服务器分离,且使用lighttpd等轻量级服务器

5、  数据库集群和库表散列

6、  缓存。
           a)架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块,也可以使用外加的Squid进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。

           b)网站程序开发方面的缓存,Linux上提供的Memcached是常用的缓存方案,不少web编程语言都提供memcache访问接口,php、 perl、c和java都有,可以在web开发中使用,可以实时或者Cron的把数据、对象等内容进行缓存,策略非常灵活。一些大型社区使用了这样的架 构。各种语言基本都有自己的缓存模块和方法。

7、  镜像。有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。(多个服务器,youtube就是用rsync同步的)

8、  负载均衡。
         a)  硬件四层交换。比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。
         b) 软件四层交换。可以使用Linux上常用的LVS来解决,LVS就是Linux  Virtual  Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时 满足多种应用需求,这对于分布式的系统来说必不可少
         c)  一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。

9、 常用方式。前层的反向代理加速—Web  Server—Cache  Server—DB。而负载均衡的方式也使用了如DNS轮循或部分硬件负载均衡设备来承担大流量.(DIY也未尝不可,一台1U的IA32硬件设备,  板子需要是为fw,switch设计的,  使用FreeBSDϖ作系统,  主要是FS和slab的改写会是技术活)。做Web  加速和代理的软件如Lighttpd,  Nginx,HAproxy.(可以不用考虑了,配置不好,不能很好的表现)压缩工具BMDiff  和  Zippy(google就用了这两种技术,主要用于压缩网页数据,压缩比达到10:1——估计是存档数据,不是运算数据)

10、  选择ISP注意其地区带宽分布是否平衡一致;区域DNS是否优化等

11、  其他:
         a)  缓存,包括CND还是比较昂贵的,在确定缓存时要根据不同内容的访问频度进行划分,特别是注意观察缓存的命中率,如果不能达到50%以上就有问题了

         b)log是所有性能调试的起点,从development  log到production  log,从rails  log到web  server  log,不同的log有不同的侧重点,学会分析log,每个log都可能为你提供解决问题的蛛丝马迹。另外,要熟练使用benchmark结合log做 profiling,当real  time远大于db  time  +  rendering  time的时候,这点尤其重要。

转自: http://machael.blog.51cto.com/829462/239075

VM如何做数据漂移

      目前的虚拟机软件,都是在一台物理机上面虚拟出几个VM来进行管理的,暂时还无法做到将物理机整合为一台超级计算机之后再在上面虚拟出VM。为了有效的管理虚拟机,就需要要对虚拟机进行漂移。
如果对虚拟机的实时性要求不高,完全可以做到先将虚拟机关闭之后,再SCP数据到指定的物理机上,重新开启虚拟机即可。对于有时间要求的,我们也可以通过控制VM,让VM先休眠,再漂移数据,然后再重启VM也行。
但是有些系统,如数据库服务器,要求系统能够做到实时漂移,该使用什么样的方案呢?VMware可以做到这一点了,从他们的技术展示会上,也没有明白具体 思路,只知道是快照+恢复。但是我们使用vmware的快照功能,也是需要几秒钟的,他说的实时是一个偷梁换柱的概念?当然了,对于这种系统,数据肯定是 存储在虚拟机之外的存储设备上的,漂移的只是内存中的数据。
如果使用虚拟机的双机热备,也是一种方法,但是需要用户在虚拟机里面安装热备软件,操作起来麻烦,如果能够在VM这个层面解决是最好的,便于管理,还减少用户烦恼。
VM实时漂移的先决条件(该资料由李战提供,非常感谢):
1.VM的磁盘要能瞬间“漂移”
  如果VM的磁盘实际映射的是宿主物理机的磁盘或磁盘文件,就很难漂移。一般的做法就是给VM提供虚拟磁盘,实际对应的是分布式储存系统。VM要漂移到新的宿主机,只需用原来的虚拟磁盘ID去挂载虚拟磁盘即可实现磁盘的瞬间“漂移”。因此,云计算的分布式存储系统非常重要。


2.VM的访问路径要能瞬间切换
  VM的漂移会引发VM物理网络访问路径的变化。如果漂移前后的地方处没有跨三层交换机或处于二层交换 机,可以做到漂移后的IP地址不变。如果跨三层交换机,需要更新IP的路由,这比较麻烦。如果只是WEB应用,可以通过VIP,让对外的IP不变,而内部 IP变化后,更新VIP映射关系。
VM漂移的基本过程:
1.新建一个同样配置的VM
2.从旧VM同步内存数据到新VM,这是一个逐步逼近的过程
3.当双方内存快接近一致时,暂停旧VM,同步最后的差异数据(很快)
4.切换虚拟磁盘,切换网络访问路径
5.继续新VM运行
这个过程快的话可以在零点几秒完成,慢的话也就1-2秒。
如果程序的socket连着,你从一台瞬间飘另外一台, 这个socket会不会断?如果漂移后的IP不变,是不会断的,只要迁移后的路由仍然可达,双方的连接状态还是持续的。但是socket属于外部连接,停机切换那会肯定要断开一下的最多有几个包要丢失而重发,但对TCP连接来说是透明的。

mysql 主从同步原理

转自: http://machael.blog.51cto.com/829462/239112

Replication 线程

   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
  要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
  MySQL 复制的基本过程如下:
  1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
   2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
  3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
   4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。
  实际上,在老版本中,MySQL 的复制实现在 Slave 端并不是由 SQL 线程和 IO 线程这两个线程共同协作而完成的,而是由单独的一个线程来完成所有的工作。但是 MySQL 的工程师们很快发现,这样做存在很大的风险和性能问题,主要如下:
   首先,如果通过一个单一的线程来独立实现这个工作的话,就使复制 Master 端的,Binary Log日志,以及解析这些日志,然后再在自身执行的这个过程成为一个串行的过程,性能自然会受到较大的限制,这种架构下的 Replication 的延迟自然就比较长了。
   其次,Slave 端的这个复制线程从 Master 端获取 Binary Log 过来之后,需要接着解析这些内容,还原成 Master 端所执行的原始 Query,然后在自身执行。在这个过程中,Master端很可能又已经产生了大量的变化并生成了大量的 Binary Log 信息。如果在这个阶段 Master 端的存储系统出现了无法修复的故障,那么在这个阶段所产生的所有变更都将永远的丢失,无法再找回来。这种潜在风险在Slave 端压力比较大的时候尤其突出,因为如果 Slave 压力比较大,解析日志以及应用这些日志所花费的时间自然就会更长一些,可能丢失的数据也就会更多。
   所以,在后期的改造中,新版本的 MySQL 为了尽量减小这个风险,并提高复制的性能,将 Slave 端的复制改为两个线程来完成,也就是前面所提到的 SQL 线程和 IO 线程。最早提出这个改进方案的是Yahoo!的一位工程师“Jeremy Zawodny”。通过这样的改造,这样既在很大程度上解决了性能问题,缩短了异步的延时时间,同时也减少了潜在的数据丢失量。
  当然,即使是换成了现在这样两个线程来协作处理之后,同样也还是存在 Slave 数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是存在的。
   如果要完全避免这些问题,就只能用 MySQL 的 Cluster 来解决了。不过 MySQL的 Cluster 知道笔者写这部分内容的时候,仍然还是一个内存数 据库的解决方案,也就是需要将所有数据包括索引全部都 Load 到内存中,这样就对内存的要求就非常大的大,对于一般的大众化应用来说可实施性并不是太大。当然,在之前与 MySQL 的 CTO David 交流的时候得知,MySQL 现在正在不断改进其 Cluster 的实现,其中非常大的一个改动就是允许数据不用全部 Load 到内存中,而仅仅只是索引全部 Load 到内存中,我想信在完成该项改造之后的 MySQL Cluster 将会更加受人欢迎,可实施性也会更大。

MT.EXE是一个网络管理方面的软件

MT.EXE是一个网络管理方面的软件,有了这40K的一个程序,居然有大约40项实用功能:

用法: mt.exe <选项>
选项 :
-filter —更改 TCP/IP 过滤器的开头状态
-addport —添加端口到过滤器的允许列表
-setport —设置端口作为过滤器的允许列表
-nicinfo —列出 TCP/IP 界面信息
-pslist —列出活动进程
-pskill —杀毒指定进程
-dlllist —列出指定进程的 DLL
-sysinfo —列出系统信息
-shutdown —关闭系统
-reboot —重启系统
-poweroff —关闭电源
-logoff —注销当前用户会话
-chkts —检查终端服务信息
-setupts —安装终端服务
-remts —卸载终端服务
-chgtsp —重置终端服务端口
-clog —清除系统日志
-enumsrv —列出所有服务
-querysrv —列出指定服务的详细信息
-instsrv —安装一个服务
-cfgsrv —更改服务配置
-remsrv —卸载指定服务
-startsrv —启动指定服务
-stopsrv —停止指定服务
-netget —从 http/ftp 下载
-redirect —端口重定向
-chkuser —列出所有账户、sid 和 anti 克隆
-clone —克隆 admin 到目标
-never —设置账户看上去从未登录
-killuser —删除账户,甚至是 "guest" 也可删除
-su —以 Local_System 权限运行进程
-findpass —显示所有已登录用户的口令
-netstat —列出 TCP 连接
-killtcp —杀死 TCP 连接
-psport —映射端口到进程
-touch —设置文件日期和时间到指定值
-secdel —安全擦除文件或目录占用的空间
-regshell —进入一个控制台注册表编辑器
-chkdll —检测 gina dll 后门

使用示例
     ——By 中国X黑客小组

一,MT.EXE –filter
用法:
MT -filter <ON|OFF> →Enabld|Disable TCP/IP Filter.
从上面的说明可以知道,这个是打开关闭TCP/IP筛选的,我们先来试一下,输入命令:
D:\>MT -FILTER on

Enable TCP/IP Filter successful!
这个时候我们看看是不是打开了TCP/IP筛选,打开网络连接选项,右键本地连接—Internet协议(TCP/IP)属性→高级—选项→TCP/IP筛选→-属性,我们看到的这样的情况,如图:

可以看见,我们已经启用了这个TCP/IP筛选,再次输入命令:
D:\>MT -FILTER off

Disable TCP/IP Filter successful!
查看属性:

有了这个工具,我们就不必那样的麻烦的点击鼠标了,一切都很简单.

二, D:\>mt -addport

用法:
mt -addport <TCP|UDP> NIC PortList →Add ports to the allowed portlist.
Use "-nicinfo" get Nic number first.
从说明上面看,是增加端口列表中允许通讯的端口,还是和上面的一样,我们来看看这个功能是如何的强大:
五, -pslist —List active processes.
列出活动进程,经常用PSTOOLS的很熟悉这个功能了,在这里,我将这个工具和pstools的工具相比较,看看他们的功能怎么样?
D:\>mt -pslist

PID Path
0 [Idle Process]
4 l[System]
464 \SystemRoot\System32\smss.exe
524 \??\C:\WINDOWS\system32\csrss.exe
548 \??\C:\WINDOWS\system32\winlogon.exe
592 C:\WINDOWS\system32\services.exe
604 C:\WINDOWS\system32\lsass.exe
780 C:\WINDOWS\system32\svchost.exe
844 C:\WINDOWS\System32\svchost.exe
876 C:\Program Files\TGTSoft\StyleXP\StyleXPService.exe
932 C:\WINDOWS\System32\svchost.exe
960 C:\WINDOWS\System32\svchost.exe
1128 C:\WINDOWS\System32\alg.exe
1160 C:\WINDOWS\System32\inetsrv\inetinfo.exe
1188 D:\mysql\bin\mysqld-nt.exe
1280 C:\WINDOWS\System32\nvsvc32.exe
1728 C:\WINDOWS\Explorer.EXE
212 C:\WINDOWS\System32\ctfmon.exe
504 D:\Program Files\Microsoft Office\Office10\WINWORD.EXE
924 D:\Program Files\MYIE2\myie.exe
1348 C:\WINDOWS\System32\dllhost.exe
1516 C:\WINDOWS\System32\dllhost.exe
1856 C:\WINDOWS\System32\msdtc.exe
1356 C:\WINDOWS\System32\cmd.exe
1004 C:\WINDOWS\System32\conime.exe
1748 D:\Program Files\HyperSnap-DX 5\HprSnap5.exe
1272 D:\MT.exe
我们使用PSLIST得到的结果:
D:\hack>pslist

PsList v1.12 – Process Information Lister
Copyright (C) 1999-2000 Mark Russinovich
Systems Internals – http://www.sysinternals.co…

Process information for LIN:

Name Pid Pri Thd Hnd Mem User Time Kernel Time Elapsed Time
Idle 0 0 1 0 20 0:00:00.000 0:40:22.453 0:00:00.000
System 4 8 56 258 40 0:00:00.000 0:00:06.098 0:00:00.000
smss 464 11 3 21 44 0:00:00.010 0:00:00.100 0:43:10.565
csrss 524 13 11 416 3892 0:00:02.042 0:00:14.240 0:43:06.449
winlogon 548 13 19 443 1044 0:00:01.171 0:00:01.882 0:43:04.185
services 592 9 21 307 940 0:00:00.721 0:00:01.662 0:43:01.582
lsass 604 9 19 304 1132 0:00:00.540 0:00:00.690 0:43:01.532
svchost 780 8 8 255 824 0:00:00.200 0:00:00.160 0:42:58.687
svchost 844 8 55 1214 5740 0:00:02.393 0:00:01.932 0:42:58.457
StyleXPSer 876 8 2 38 416 0:00:00.110 0:00:00.070 0:42:58.357
svchost 932 8 5 46 396 0:00:00.020 0:00:00.040 0:42:56.705
svchost 960 8 7 90 204 0:00:00.060 0:00:00.040 0:42:56.244
alg 1128 8 5 116 220 0:00:00.020 0:00:00.060 0:42:49.144
inetinfo 1160 8 17 281 864 0:00:00.210 0:00:00.330 0:42:49.054
mysqld-nt 1188 8 6 81 76 0:00:00.010 0:00:00.050 0:42:47.602
nvsvc32 1280 8 3 74 92 0:00:00.090 0:00:00.160 0:42:45.378
Explorer 1728 8 20 583 19548 0:00:11.436 0:00:27.519 0:42:37.607
ctfmon 212 8 1 109 1596 0:00:00.340 0:00:01.031 0:42:26.982
WINWORD 504 8 5 394 43428 0:01:04.072 0:00:25.757 0:41:26.194
myie 924 8 9 312 3116 0:00:09.623 0:00:07.460 0:35:36.582
dllhost 1348 8 23 240 1540 0:00:01.982 0:00:00.460 0:35:24.414
dllhost 1516 8 15 200 784 0:00:00.190 0:00:00.230 0:35:22.912
msdtc 1856 8 18 149 372 0:00:00.080 0:00:00.090 0:35:18.896
cmd 1356 8 1 21 592 0:00:00.080 0:00:00.100 0:32:44.414
conime 1004 8 1 25 664 0:00:00.050 0:00:00.030 0:32:42.652
HprSnap5 1748 8 6 168 1648 0:00:01.932 0:00:03.414 0:18:38.798
cmd 1548 8 1 20 1392 0:00:00.020 0:00:00.010 0:00:28.020
pslist 1716 8 2 82 1672 0:00:00.030 0:00:00.050 0:00:00.400
使用PULIST得到的结果:
E:\HACK>pulist
Process PID User
Idle 0
System 4
smss.exe 464 NT AUTHORITY\SYS
csrss.exe 524 NT AUTHORITY\SYS
winlogon.exe 548 NT AUTHORITY\SYS
services.exe 592 NT AUTHORITY\SYS
lsass.exe 604 NT AUTHORITY\SYS
svchost.exe 780 NT AUTHORITY\SYS
svchost.exe 844 NT AUTHORITY\SYS
StyleXPService.exe 876 NT AUTHORITY\SY
svchost.exe 932
svchost.exe 960
alg.exe 1128
inetinfo.exe 1160 NT AUTHORITY\SYS
mysqld-nt.exe 1188 NT AUTHORITY\SYS
nvsvc32.exe 1280 NT AUTHORITY\SYS
Explorer.EXE 1728 LIN\lin
ctfmon.exe 212 LIN\lin
WINWORD.EXE 504 LIN\lin
MyIE.exe 924 LIN\lin
dllhost.exe 1348
dllhost.exe 1516 NT AUTHORITY\SYS
msdtc.exe 1856
cmd.exe 1356 LIN\lin
conime.exe 1004 LIN\lin
HprSnap5.exe 1748 LIN\lin
cmd.exe 1548 LIN\lin
pulist.exe 1788 LIN\lin
从 上面的情况可以知道,输入MT还没有PSLIST功能的强大,能够列出 Name,Pid,Pri,Thd Hnd,Mem,User Time,Kernel Time,Elapsed Time,但是较于PULIST,已经是很好的了,能够列出进程名和运行路径,已经能够满足我们平时的使用了.

六, D:\>mt -pskill

用法:
mt -pskill <PID|ProcessName>
同样也是PSTOOLS的工具之一了,我们使用MyIE.exe这个软件作为测试,看看他们能不能杀死这个进程,首先是使用MT,通过上面的 MT –PSLIST,我们知道MyIE.exe的PID值是924,于是输入:
D:\>mt -pskill 924

Kill process sccuessful!
很快,MYIE就消失了,也就是被KILL了,再使用PSKILL.EXE,我们表示公平统一性,我们还是有PSLIST取得MYIE的PID 值,重新打开MYIE,得到它的PID值为220,我们输入:
D:\hack>pskill 220

PsKill v1.03 – local and remote process killer
Copyright (C) 2000 Mark Russinovich
http://www.sysinternals.co…

Process 220 killed.
同样也是很快被KILL,说明MT和PSKILL的功能是一样的,使用MT也可以达到和PSKILL一样的效果.
我们发现MT一个比较弱的功能的就是没有和PSKILL一样支持网络功能,在PSKILL中可以通过 pskill [\\RemoteComputer [-u Username]] <process Id or name>
-u Specifies optional user name for login to
remote computer.
杀死远程的计算机进程,当然,我们不可能指望MT也能有这样强大的功能,毕竟我们用的仅仅才只有40K.

七, D:\>mt -dlllist

用法:
mt -dlllist <PID|ProcessName>
列出进程中相关的DLL文件,于这个相关功能的软件我没有找到,不过我们使用Windows优化大师,我们先来测试一下,这次我们选中的进程是 StyleXPService.exe.还是使用MT –pslist得到其PID值876,输入:
D:\>mt -dlllist 876

C:\Program Files\TGTSoft\StyleXP\StyleXPService.exe
C:\WINDOWS\System32\ntdll.dll
C:\WINDOWS\system32\kernel32.dll
C:\WINDOWS\system32\USER32.dll
C:\WINDOWS\system32\GDI32.dll
C:\WINDOWS\system32\ADVAPI32.dll
C:\WINDOWS\system32\RPCRT4.dll
C:\WINDOWS\system32\ole32.dll
C:\WINDOWS\system32\OLEAUT32.dll
C:\WINDOWS\system32\MSVCRT.DLL
C:\WINDOWS\system32\VERSION.dll
C:\WINDOWS\System32\SETUPAPI.dll
C:\WINDOWS\System32\NETAPI32.dll
C:\WINDOWS\System32\IMM32.DLL
C:\WINDOWS\System32\LPK.DLL
C:\WINDOWS\System32\USP10.dll
C:\WINDOWS\System32\UXTHEME.DLL
C:\WINDOWS\System32\rsaenh.dll
打开Windows优化大师,看看它得到的相关DLL文件是什么?如图:

使用MT得到的DLL相关文件和Windows优化大师的是一摸一样的,我们可以肯定使用MT绝对比使用Windows优化大师方便快捷.

八, mt –sysinfo
列出系统信息,还是使用Windows优化大师与之作比较,发现几乎没有任何的失误,可见准确性特别强的,由于页面的关系,数据不再展示. 这个功能和程序sysinfo.exe是一样的.
九, -shutdown —Shutdown system.
-reboot —Reboot system.
-poweroff —Turn off power.
-logoff —Logoff current user’s session.
这4个命令就不说了,和系统工具shutdown不一样的是,输入之后没有任何的提示,直接关机,我已经试过了,幸亏还记得保存.
十, -chkts —Check Terminal Service info.
-setupts —Install Terminal Service.
-remts —Remove Terminal Service.
-chgtsp —Reset Terminal Service port.
这4个命令是和Terminal相关的,由于没有安装服务器版本的系统,所以没有测试.
十一, -clog —Clean system log.
用来清除记录,我们输入:
D:\>mt -clog

用法:
mt -clog <app|sec|sys|all> —Clean Application|Security|System|All logs.
从上面的可以看出,我们可以清除 "应用程序" "安全性" "系统"3个日志,我随便选择一个,用MT删除 "应用程序"日志,输入:
D:\>mt -clog app
Clean EventLog : Application successful!
打开事件查看器,如图,

可以看出日志已经被清空,不过MT并不能和小榕的Cleariislog相比,不能删除指定IP的日志,这个可能是yy3并没有考虑将这个工具用作那样的用途.

十二, -enumsrv —List all services.
列出所有的服务,这个测试可能你的不同,因为我已经删除了很多的服务的了,为了精简系统和提升速度,还是来看看,
D:\>mt -enumsrv

用法:
mt -enumsrv <SRV|DRV> →List all Win32|Driver Service

D:\>mt -enumsrv srv

Num ServiceName DisplayName

0 Alerter Alerter
1 ALG Application Layer Gateway Service
2 AppMgmt Application Management
3 aspnet_state ASP.NET State Service
4 AudioSrv Windows Audio
(省略以下大部分的内容)
D:\>mt -enumsrv drv

Num ServiceName DisplayName

0 Abiosdsk Abiosdsk
1 abp480n5 abp480n5
2 ACPI Microsoft ACPI Driver
3 ACPIEC ACPIEC
4 adpu160m adpu160m
5 aec Microsoft Kernel Acoustic Echo Canceller
6 AFD AFD 网络支持环境
7 Aha154x Aha154x
8 aic78u2 aic78u2
(省略以下大部分的内容)
实在是太多了,也不想说什么了,只有一个字→高.
十三, D:\>mt -querysrv

用法:
mt -querysrv <ServiceName> →Show detial info of a specifies service.
列出服务的详细信息,我们查看系统进程Alerter的信息,输入:
D:\>mt -querysrv Alerter

ServiceName: Alerter
Status: Stopped
ServiceType: Win32 Share Service
Start type: Demand Start
LogonID: NT AUTHORITY\LocalService
FilePath : C:\WINDO

用ntsd命令杀进程

ntsd命令杀进程

 

我前段时间发现我的机子里多了一个进程,只要开机就在,我用任务管理器却怎么关也关不了

杀进程很容易,随便找个工具都行。比如IceSword。关键是找到这个进程的启动方式,不然下次重启它又出来了。

顺便教大家一招狠的。其实用Windows自带的工具就能杀大部分进程:

c:\>ntsd -c q -p PID

只有SystemSMSS.EXECSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。

ntsd2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。

ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就行了。

Ntsd按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。有关详细信息,请参阅 NTSD 中所附的帮助文件。

用法:开个cmd.exe窗口,输入:

ntsd -c q -p PID

把最后那个PID,改成你要终止的进程的ID
如果你不知道进程的ID,任务管理器-》进程选项卡-》查看-》选择列-》
勾上"PID(进程标识符)",然后就能看见了。