vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等。对于 Linux 的性能分析,100%理解 vmstat 输出内容的含义,并能灵活应用,那对系统性能分析的能力就算是基本掌握了。
下面是vmstat命令的输出结果:
[root@monitor-www ~]# vmstat 1 5
procs — ———–memory——————–swap——io—– —-system— —–cpu—
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 84780 909744 267428 1912076 0 0 20 94 0 0 2 1 95 1 0
1 2 84780 894968 267428 1912216 0 0 0 1396 2301 11337 8 3 89 0 0
1 0 84780 900680 267428 1912340 0 0 76 1428 1854 8082 7 2 90 0 0
1 0 84780 902544 267432 1912548 0 0 116 928 1655 7502 7 2 92 0 0
2 0 84780 900076 267432 1912948 0 0 180 904 1963 8703 10 3 87 0 0
对输出解释如下:
1)procs
a.r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;
b.b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。
2)memory
a.swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;
b.free列表示当前空闲的物理内存数量(以KB为单位);
c.buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲;
d.cache列表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。
3)swap
a.si列表示由磁盘调入内存,也就是内存进入内存交换区的数量;
b.so列表示由内存调入磁盘,也就是内存交换区进入内存的数量
c.一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存。
4)IO
a.bi列表示从块设备读入的数据总量(即读磁盘,单位KB/秒)
b.bo列表示写入到块设备的数据总量(即写磁盘,单位KB/秒)
这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。
5)system
a.in列表示在某一时间间隔中观察到的每秒设备中断数;
b.cs列表示每秒产生的上下文切换次数。
上面这两个值越大,会看到内核消耗的CPU时间就越多。
6)CPU
a.us列显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。
b.sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,就说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
c.id列显示了CPU处在空闲状态的时间百分比;
d.wa列表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
e.st列一般不关注,虚拟机占用的时间百分比。
转帖: www.linuxsky.org/doc/newbie/200707/84.html
在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置:
1. LC_COLLATE
定义该环境的排序和比较规则
2. LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。
3. LC_MONETARY
货币格式
4. LC_NUMERIC
非货币的数字显示格式
5. LC_TIME
时间和日期格式
6. LC_MESSAGES
提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。
7. LANG
LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。
8. LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。
"POSIX" :Specifies the minimal environment for C-language translation called the POSIX locale. If setlocale() is not invoked, the POSIX locale is the default
"C" Equivalent to "POSIX".
-----------------------------------
How to view the current locale setting?
# locale
How to change the locale setting?
* Via the CDE login locale
* As a user-specific locale
* As a system default locale
To change the current locale setting, first confirm that the desired locale is
installed on the system with:
# locale -a
de
en_AU
en_CA
en_UK
C
If the desired locale is not in the list, you will need to install the
appropriate packages for that locale. See the Note below for more information
about locale packages.
How to change the locale via the CDE login locale?
On the CDE login banner:
Choose options - languages
Under languages - choose the new locale
The CDE banner will re-cycle and then you can login to the selected locale.
NOTE: If a user has a different default locale set in their environment, the
that locale setting will override the selected CDE login locale.
How to set a user-specific locale?
Note:
For sh, ksh:
# LANG=C; export LANG
# LC_ALL=C; export LC_ALL
For csh:
# setenv LANG C
# setenv LC_ALL C
Note: To set a default locale for a user's environment, set the LANG or LC_*
variables in a user's shell intialization file such as $HOME/.profile or
$HOME/.cshrc
How to change the locale by setting the system default locale?
LANG=C
LC_ALL=C
Example from the /etc/default/init file:
# Lines of this file should be of the form VAR=value, where VAR is one of
# TZ, LANG, or any of the LC_* environment variables.
LANG=C
LC_ALL=C
Note: The system must be rebooted after making changes to the
/etc/default/init file in order for the changes to take effect.
How to verify the locale setting?
After setting or changing the locale, verify that the locale is set correctly:
Check if the locale is set correctly by running the locale command without any
options:
# locale
LANG=C
LC_CTYPE= "C"
LC_NUMERIC= "C"
LC_TIME= "C"
LC_COLLATE= "C"
LC_MONETARY= "C"
LC_MESSAGES= "C"
LC_ALL=C
a站点iframe嵌入b站点的页面,但是被ie8阻止了cookie,java代码设置heade没用,配置了apache httpd。conf才解决,原文如下:
P3P,不算是新名词,但还是有些人不清楚。事实上我也不清楚。。。在百度上看到有这玩意就备份下来。说真的,我只是知道用,但不知道为什么用。额。。很明显,因为在ucenter同步的时候,在discuz的ui/api里有写过。
看内容吧。。。。
IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存 在此问题了。
在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie, 也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏 览器的。
在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe 指向 b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。 所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.
解决方案.
PHP 的程序 , 可以直接在B网站中写入www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
PHP代码
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"' );
?>
这样就能接受第三方的Cookie啦。
lighttpd的服务器
XML/HTML代码
server.modules = ("mod_setenv")
setenv.add-response-header = ( "P3P" = > " CP = 'CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR' ")
apache的服务器
XML/HTML代码
< VirtualHost >
Header set P3P 'CP = "CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" '
</ VirtualHost >
IIS的服务器 www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
增加一个网站http头来解决问题;www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
管理 工具——〉选择一个网站 ——〉属性——〉 http头,增加一个http头www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
然后输入头名:P3Pwww.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
输入头内容:CP=CAO PSA OUR
jsp页面:
XML/HTML代码
< %
response.setHeader("P3P","CP = CAO PSA OUR");
%>
java代码最简单的办法,增加一个filte:
Java代码
public class TransNameFilter extends HttpServlet implements Filter {
private static org.apache.commons.logging.Log logWriter =
LogFactory.getLog(TransNameFilter.class .getName());
/**
*
*/
public TransNameFilter() {
super ();
}
/* (非 Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
}
/* (非 Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) request;
String transName = hreq.getParameter("transName" );
if (Util.isNullOrEmpty(transName)) {
logWriter.fatal(" there is no transName for this request" );
} else {
logWriter.info(" transName is " + transName);
}
HttpServletResponse res = (HttpServletResponse) response;
//iframe引起的内部cookie丢失
res.setHeader("P3P" , "CP=CAO PSA OUR" );
if (chain != null )
chain.doFilter(request, response);
}
/* (非 Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}
来自:http://blog.csdn.net/ljwhx2002/article/details/6115731
1.挂载光盘
[root@fortest Server]# mount -t iso9660 -o loop /dev/cdrom /media/CentOS
2.删除/etc/yum.repos.d目录所有的repo文件
[root@fortest Server]# rm -rf /etc/yum.repos.d/*
3.创建新文件dvd.repo
[root@fortest Server]# vim /etc/yum.repos.d/dvd.repo
加入以下内容:
[dvd]
name=install dvd
baseurl=file:///media/CentOS
enabled=1
gpgcheck=0
4.刷新repos,生成缓存
[root@fortest Server]#yum makecache
然后就可以使用yum命令安装你所需要的软件包了
1. mac 和 IP 绑定
arp -s IP地址 MAC地址
2. 还需要把绑定的mac地址告诉网关
ARPing -U -I 发送包的网卡接口 -s 源ip 目的ip
实例:
假设你的eth0接口对应的ip为192.168.1.1,网关为192.168.1.255你就可以使用
ARPing -U -I eth0 -s 192.168.1.1 192.168.1.255
--------------------------------------------------------------------------------
-s src_ip 指定源ip为src_ip
-I ethi 指定使用ethi网卡
相关命令参数表 -c n 发送n个数据报数目后退出程序
-w sec sec秒后退出程序
-f 收到一个回复包就退出程序
-q quiet安静模式
-V 显示版本
1. ucenter的升级
如果你的ucenter是1.0版本,那么先升级到1.5.2
首先参看以下教程(此教程同样适用于1.5.0,1.5.1, 1.5.2)
http://faq.comsenz.com/viewnews-452
如果你的ucenter是1.5.0 或者 1.5.1 要想升级到 1.5.2 那么直接 下载1.5.2的程序,覆盖原来的程序即可。
注意: upload 目录中的 install 和 upgrade 目录不需要上传,如果已经上传,请使用ftp删除他
程序下载地址:
UCenter1.5.1
http://download.comsenz.com/UCenter/1.5.1/
UCenter1.5.2
http://download.comsenz.com/UCenter/1.5.2/
下面是ucenter1.5.2 到ucenter1.6的升级教程
http://www.discuz.net/thread-2141455-1-1.html
昨天装了一整天的loadrounner8.1版本,因为一开始用的不是自己装的,没想到loadrounner从卸载到重新安装如此的麻烦
现在记录一下成功安装的步骤吧:
1.setup.exe安装,直至需要填写序列号处,会有个默认的8888-88888888之类的,不用修改,直接点击next;
2.安装最后让你重新启动,也暂时不要重新启动,把破解文件 lm70.dll,mlr5lprg.dll
4h.A Hs1VN Ce242309这两个文件复制并粘贴到LR8.1安装目录下的bin文件夹下,一般是C:\Program Files\Mercury\LoadRunner\bin;
3.重新启动系统,启动LR,菜单项“CONFIGURATION”-->“LoadRunner License”下选中“LicenseKey1”,点击“New License”输入7.8、8.0通用的license:51Testing软件测试网?
golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
.NT7TP6e1[\ZVU3pG242309web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB(我输入的是这个)即可
上面两个license,第一个是100个用户(无时间限制),第二个是10000个用户(有时间限制)。
如果是卸载后重新安装loadrounner,记得千万要卸干净,要不然license无法填入。
昨天安装好以后出现录制脚本0 events的现象,不过修改IE的高级选项,取消选中“启用第三方浏览器扩展*”(我用的是IE8,应该每个版本的描述都差不多)可以了。但是今天一来一用又那样了,真搞不清楚是怎么回事?看来今天又要重新研究这个问题了,而且昨天录制了脚本还出现录制程序错误的提示,录完点击stop就异常退出了,也不清楚是什么问题?
卸载LR8.1
一直认为LR只有重装系统才能在装,每次装LR都要求自己只许成功,不许失败,下面的方法是我转来的,非常受用,适合新手,呵呵。
一、卸载LR8.1程序
1.保证所有LoadRunner的相关进程(包括Controller、VuGen、Analysis和Agent Process)全部关闭。
2.在操作系统控制面板的“删除与添加程序”中运行LoadRunner的卸载程序。
3.删除整个LoadRunner目录。(包括Agent Process)
4.在搜索中查找下列文件,并且删除它们。
1) wlrun.*
2) vugen.*
二、删除注册表(最重要的)
1.运行注册表程序(开始- 运行- regedit)
2.删除下列键值。
HKEY_CLASSES_ROOT\Mercury.Lm70Control
HKEY_CLASSES_ROOT\Mercury.Lm70Control.1
同时删除
Mercury.Lm70ControlMgr
Mercury.Lm70ControlMgr.1
一定要多查找几遍,发现Lm70Contro字样的东西都要删除掉!
3.最后删除下面内容:
HKEY_CURRENT_USER\Software\Mercury Interactive\LoadRunner
HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner
这些步骤都走了一遍,确定注册表里没有那些关键字以后,重启一下电脑,开始安装LR9.0!!
我的解压过程没有遇到其他网友说的问题,直接双击运行,一直顺利通过!
loadrunner9.0破解方法
1、过程和方法:
打开Loadrunner,发现以下几个dll可能和注册有关,mlr5lprg.dll、licensebundles.dll、lm50.dll、lm70.dll。
如果熟悉LR的朋友,LR7.8、8.0、8.1中都没有Licensebundles.dll,这是一个新的综合捆绑dll,所以我在之前的一些朋友的帖子里说破解难度大,也是这个原因。
但是万幸的是,我在LR8.1.4.0中发现了licensebundles.dll,也就是LR8.1打上FP4补丁,并且用我以前的针对LR8.1的办法有效,因此,LR9.0的破解方案也就很快出现:
a、用LR8.1.4.0中的lm50.dll、licensebundles.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
b、用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
c、然后使用老的注册码就可以使用了;
d、golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
2、遇到的问题
在破解的过程中我还遇到了个问题,就是通过上述的方法注册时提示“License security violation……”,无法注册,后通过针对LR注册表删除的工具运行后再注册就通过了。
(这个问题我也没有遇到,直接输入了License就可以了)
安装完毕后,通过简单录制查看安装是不是真的成功,就在这时问题出现了!
1.LR打开IE后IE不自动出来
2.在LR打开的IE中访问不到服务,并且服务正常
还好,在网上搜索到了云层老师的博客,里面正好有这方面的解决方法:
1.这个问题还是IE的,找到IE的高级选项,里面有个第三方扩展支持,去掉就行了
2.这个问题是LR8.x系列会篡改IE的代理设置,关闭LR,打开IE中的选项,找到代理服务器,把最下面的对本地不使用代理服务器勾上,再把上面的使用代理服务器去掉,打开LR在录制选项中将代理设置为无。
再次录制,OK,成功!!
软件测试工具LoadRunner常见问题整理
1.LoadRunner录制脚本时为什么不弹出IE浏览器?
当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。
启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题
提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。
2.录制Web脚本时,生成的脚本中存在乱码该如何解决?
录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选“Support charset”,然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。
3.HTML-based script与URL-based script的脚本有什么区别?
使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。
通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。
4.为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?
由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time Setting。
进入“Run-time Setting”对话框,依次进入“Internet Protocol→Preferences”,勾选Checks下的“Enable Image and text check”选项即可。
检查执行结果时推荐使用web_reg_find方法。
5.运行时的Pacing设置主要影响什么?
Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。
根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。
6.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗?
Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。
7.LoadRunner 8.0版本的VuGen在录制Web Services协议的脚本时一切正常,而回放时报出错误提示“Error:server returned an incorrectly formatted SOAP response”。这时说明原因引起的?
造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web Service协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为,因此会有上面的错误提示。
解决方法:把“LR80WebservicesFPI_setup.exe”和“lrunner_web_sevices_path_1.exe”两个补丁打上即可解决。
8.VuGen支持Netscape的客户证书吗?
不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。
9.VuGen会修改录制浏览器中的代理服务器设置吗?
会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。
10.在LoadRunner脚本如何输出当前系统时间?
LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。
调用语句与返回值如下示例:
typedef long time_t;
Action()
{
time_t t;
lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));
lr_message(“System time and date: %s”,ctime(&t));
}复制代码
输出结果为:
Time in seconds since 1/1/70: 1185329968
System time and date:Wed Jul 25 10:19:28 2007
11.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?
这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。
由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,
则用户登录信息将一并清除,因此迭代时可能会发生错误。
12.虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?
如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。
另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。
13.在Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?
这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。
进入“Run-time Setting”对话框后,依次进入“Internet Protocol→Preference”。然后点击“Options…”按钮,进入高级设置对话框,可以修改各类超时设置的默认值。
14.为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?
在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。
(1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。
(2)找到Windows关键字,Windows关键字如下所示:
%SystemRoot%\system32\csrss.exe bjectDirectory=\Windows
SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1
ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2
ProfileControl=Off MaxRequestThreads=16
SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。
(3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。
通过对注册表的更改,系统将允许运行更多的线程,
因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。
仅仅使用字面意义上的常量很快就会引发烦恼——我们需要一种既可以储存信息 又可以对它们进行操作的方法。这是为什么要引入 变量 。变量就是我们想要的东西——它们的值可以变化,即你可以使用变量存储任何东西。变量只是你的计算机中存储信息的一部分内存。与字面意义上的常量不同,你需要一些能够访问这些变量的方法,因此你给变量名字。
标识符命名
变量是标识符的例子。 标识符 是用来标识 某样东西 的名字。在命名标识符的时候,你要遵循这些规则:
标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’)。
标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字(0-9)组成。
标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。注意前者中的小写n和后者中的大写N。
有效 标识符名称的例子有i、__my_name、name_23和a1b2_c3。
无效 标识符名称的例子有2things、this is spaced out和my-name。
数据类型
变量可以处理不同类型的值,称为数据类型。基本的类型是数和字符串,我们已经讨论过它们了。在后面的章节里面,我们会研究怎么用类创造我们自己的类型。
下一页
python 对象
if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 )。 else 从句是可选的。
#!/usr/bin/python
# Filename: if.py
number = 23
guess = int(raw_input('Enter an integer : '))
if guess == number:
print 'Congratulations, you guessed it.' # New block starts here
print "(but you do not win any prizes!)" # New block ends here
elif guess < number:
print 'No, it is a little higher than that' # Another block
# You can do whatever you want in a block ...
else:
print 'No, it is a little lower than that'
# you must have guess > number to reach here
print 'Done'
# This last statement is always executed, after the if statement is executed 输出
$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done
$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done
$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done 它如何工作
在这个程序中,我们从用户处得到猜测的数,然后检验这个数是否是我们手中的那个。我们把变量number设置为我们想要的任何整数,在这个例子中是23。然后,我们使用raw_input()函数取得用户猜测的数字。函数只是重用的程序段。我们将在下一章学习更多关于函数的知识。
我们为内建的raw_input函数提供一个字符串,这个字符串被打印在屏幕上,然后等待用户的输入。一旦我们输入一些东西,然后按回车键之后,函数返回输入。对于raw_input函数来说是一个字符串。我们通过int把这个字符串转换为整数,并把它存储在变量guess中。事实上,int是一个类,不过你想在对它所需了解的只是它把一个字符串转换为一个整数(假设这个字符串含有一个有效的整数文本信息)。
接下来,我们将用户的猜测与我们选择的数做比较。如果他们相等,我们打印一个成功的消息。注意我们使用了缩进层次来告诉Python每个语句分别属于哪一个块。这就是为什么缩进在Python如此重要的原因。我希望你能够坚持“每个缩进层一个制表符”的规则。你是这样的吗?
注意if语句在结尾处包含一个冒号——我们通过它告诉Python下面跟着一个语句块。
然后,我们检验猜测是否小于我们的数,如果是这样的,我们告诉用户它的猜测大了一点。我们在这里使用的是elif从句,它事实上把两个相关联的if else-if else语句合并为一个if-elif-else语句。这使得程序更加简单,并且减少了所需的缩进数量。
elif和else从句都必须在逻辑行结尾处有一个冒号,下面跟着一个相应的语句块(当然还包括正确的缩进)。
你也可以在一个if块中使用另外一个if语句,等等——这被称为嵌套的if语句。
记住,elif和else部分是可选的。一个最简单的有效if语句是:
if True:
print 'Yes, it is true'
在Python执行完一个完整的if语句以及与它相关联的elif和else从句之后,它移向if语句块的下一个语句。在这个例子中,这个语句块是主块。程序从主块开始执行,而下一个语句是print 'Done'语句。在这之后,Python看到程序的结尾,简单的结束运行。
尽管这是一个非常简单的程序,但是我已经在这个简单的程序中指出了许多你应该注意的地方。所有这些都是十分直接了当的(对于那些拥有C/C++背景的用户来说是尤为简单的)。
下一篇 python的while循环
记住,Python把在程序中用到的任何东西都称为 对象 。这是从广义上说的。因此我们不会说“某某 东西 ”,我们说“某个 对象 ”。
给面向对象编程用户的注释
就每一个东西包括数、字符串甚至函数都是对象这一点来说,Python是极其完全地面向对象的。
我们将看一下如何使用变量和字面意义上的常量。保存下面这个例子,然后运行程序。
如何编写Python程序
下面是保存和运行Python程序的标准流程。
1. 打开你最喜欢的编辑器。
2. 输入例子中的程序代码。
3. 用注释中给出的文件名把它保存为一个文件。我按照惯例把所有的Python程序都以扩展名.py保存。
4. 运行解释器命令python program.py或者使用IDLE运行程序。你也可以使用先前介绍的可执行的方法。
例4.1 使用变量和字面意义上的常量
# Filename : var.py
i = 5
print i
i = i + 1
print i
s = '''This is a multi-line string.
This is the second line.'''
print s 输出
$ python var.py
5
6
This is a multi-line string.
This is the second line.
它如何工作
下面来说明一下这个程序如何工作。首先我们使用赋值运算符(=)把一个字面意义上的常数5赋给变量i。这一行称为一个语句。语句声明需要做某件事情,在这个地方我们把变量名i与值5连接在一起。接下来,我们用print语句打印i的值,就是把变量的值打印在屏幕上。
然后我们对i中存储的值加1,再把它存回i。我们打印它时,得到期望的值6。
类似地,我们把一个字面意义上的字符串赋给变量s然后打印它。
给C/C++程序员的注释
使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。
下一页
逻辑行与物理行
只要在一个条件为真的情况下,while语句允许你重复执行一块语句。while语句是所谓 循环 语句的一个例子。while语句有一个可选的else从句。
#!/usr/bin/python
# Filename: while.py
number = 23
running = True
while running:
guess = int(raw_input('Enter an integer : '))
if guess == number:
print 'Congratulations, you guessed it.'
running = False # this causes the while loop to stop
elif guess < number:
print 'No, it is a little higher than that'
else:
print 'No, it is a little lower than that'
else:
print 'The while loop is over.'
# Do anything else you want to do here
print 'Done' 输出
$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done 它如何工作
在这个程序中,我们仍然使用了猜数游戏作为例子,但是这个例子的优势在于用户可以不断的猜数,直到他猜对为止——这样就不需要像前面那个例子那样为每次猜测重复执行一遍程序。这个例子恰当地说明了while语句的使用。
我们把raw_input和if语句移到了while循环内,并且在while循环开始前把running变量设置为True。首先,我们检验变量running是否为True,然后执行后面的 while-块 。在执行了这块程序之后,再次检验条件,在这个例子中,条件是running变量。如果它是真的,我们再次执行while-块,否则,我们继续执行可选的else-块,并接着执行下一个语句。
当while循环条件变为False的时候,else块才被执行——这甚至也可能是在条件第一次被检验的时候。如果while循环有一个else从句,它将始终被执行,除非你的while循环将永远循环下去不会结束!
True和False被称为布尔类型。你可以分别把它们等效地理解为值1和0。在检验重要条件的时候,布尔类型十分重要,它们并不是真实的值1。
else块事实上是多余的,因为你可以把其中的语句放在同一块(与while相同)中,跟在while语句之后,这样可以取得相同的效果。
下一篇 pyton的for循环
物理行是你在编写程序时所 看见 的。逻辑行是Python 看见 的单个语句。Python假定每个 物理行 对应一个 逻辑行 。
逻辑行的例子如print 'Hello World'这样的语句——如果它本身就是一行(就像你在编辑器中看到的那样),那么它也是一个物理行。
默认地,Python希望每行都只使用一个语句,这样使得代码更加易读。
如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法。分号表示一个逻辑行/语句的结束。例如:
i = 5
print i
与下面这个相同:
i = 5;
print i;
同样也可以写成:
i = 5; print i;
甚至可以写成:
i = 5; print i
然而,我强烈建议你坚持在每个物理行只写一句逻辑行。仅仅当逻辑行太长的时候,在多于一个物理行写一个逻辑行。这些都是为了尽可能避免使用分号,从而让代码更加易读。事实上,我 从来没有 在Python程序中使用过或看到过分号。
下面是一个在多个物理行中写一个逻辑行的例子。它被称为明确的行连接。
s = 'This is a string. \
This continues the string.'
print s
它的输出:
This is a string. This continues the string.
类似地,
print \
i
与如下写法效果相同:
print i
有时候,有一种暗示的假设,可以使你不需要使用反斜杠。这种情况出现在逻辑行中使用了圆括号、方括号或波形括号的时候。这被称为暗示的行连接。你会在后面介绍如何使用列表的章节中看到这种用法。
缩进
空白在Python中是重要的。事实上行首的空白是重要的。它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。我们将在后面的章节中看到有关块的用处的例子。
你需要记住的一样东西是错误的缩进会引发错误。例如:
i = 5
print 'Value is', i # Error! Notice a single space at the start of the line
print 'I repeat, the value is', i
当你运行这个程序的时候,你会得到下面的错误:
File "whitespace.py", line 4
print 'Value is', i # Error! Notice a single space at the start of the line
^
SyntaxError: invalid syntax
注意,在第二行的行首有一个空格。Python指示的这个错误告诉我们程序的语法是无效的,即程序没有正确地编写。它告诉你, 你不能随意地开始新的语句块 (当然除了你一直在使用的主块)。何时你能够使用新块,将会在后面的章节,如控制流中详细介绍。
如何缩进
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我 强烈建议 你在每个缩进层次使用 单个制表符 或 两个或四个空格 。
选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即 只 使用这一种风格。
下一页
运算符与表达式
for..in是另外一个循环语句,它在一序列的对象上 递归 即逐一使用队列中的每个项目。我们会在后面的章节中更加详细地学习序列。
#!/usr/bin/python
# Filename: for.py
for i in range(1, 5):
print i
else:
print 'The for loop is over' 输出
$ python for.py
1
2
3
4
The for loop is over 它如何工作
在这个程序中,我们打印了一个 序列 的数。我们使用内建的range函数生成这个数的序列。
我们所做的只是提供两个数,range返回一个序列的数。这个序列从第一个数开始到第二个数为止。例如,range(1,5)给出序列[1, 2, 3, 4]。默认地,range的步长为1。如果我们为range提供第三个数,那么它将成为步长。例如,range(1,5,2)给出[1,3]。记住,range 向上 延伸到第二个数,即它不包含第二个数。
for循环在这个范围内递归——for i in range(1,5)等价于for i in [1, 2, 3, 4],这就如同把序列中的每个数(或对象)赋值给i,一次一个,然后以每个i的值执行这个程序块。在这个例子中,我们只是打印i的值。
记住,else部分是可选的。如果包含else,它总是在for循环结束后执行一次,除非遇到break语句。
记住,for..in循环对于任何序列都适用。这里我们使用的是一个由内建range函数生成的数的列表,但是广义说来我们可以使用任何种类的由任何对象组成的序列!我们会在后面的章节中详细探索这个观点。
下一篇 python 的 break 语句
简介
你编写的大多数语句(逻辑行)都包含表达式。一个简单的表达式例子如2 + 3。一个表达式可以分解为运算符和操作数。
运算符 的功能是完成某件事,它们由如+这样的符号或者其他特定的关键字表示。运算符需要数据来进行运算,这样的数据被称为 操作数 。在这个例子中,2和3是操作数。
运算符
我们将简单浏览一下运算符和它们的用法:
技巧
你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
表5.1 运算符与它们的用法
下一页
运算符优先级
break语句是用来 终止 循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句。
一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块将不执行。
#!/usr/bin/python
# Filename: break.py
while True:
s = raw_input('Enter something : ')
if s == 'quit':
break
print 'Length of the string is', len(s)输出
$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 12
Enter something : quit
Done 它如何工作
在这个程序中,我们反复地取得用户地输入,然后打印每次输入地长度。我们提供了一个特别的条件来停止程序,即检验用户的输入是否是'quit'。通过 终止 循环到达程序结尾来停止程序。
输入字符串的长度通过内建的len函数取得。
记住,break语句也可以在for循环中使用。
下一篇 python的continue循环
- «
- 1
- ...
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- ...
- 63
- »