性能江湖中的那些问题(持续更新 8.3)

问题1:执行一段时间,vuser全部加载后,CPU突然很高,导致响应时间超长

      可能原因:F5负载均衡失效,导致某台电脑CPU过高,同时另外一台CPU过低。另外,也有可能是由于算法的因素引起的。
     
      深入排查:1.了解F5负载均衡失效的原因(可能是由于没有实施IP欺骗)
                
                2.按不同并发数施加压力,看其表现

                3.2做了之后,仍有问题,了解此段程序的算法,判断是CPU密集型应用,还是内存密集型或者IO密集型应用。据其讲算法这里很强大,因此很有可能是算法不足。

问题2:50vuser和300vuser性能表现几乎相同,资源、响应时间基本一致,性能数据呈一致性分布的问题

     可能原因:
              1.访问资源限制,这个可以问运维的人
              2.到了一定并发压力没传输过来,中间断了,50和500传输处理的东西是一样的
              3.服务器太好,根本不算啥,继续加

     深入排查:1.沟通限制是否有?
               2.确定检查点是否OK,或者打印服务器返回的日志。发送请求的文件大小是否成为瓶颈 。netstat -an查看连接的端口有多少
               3.做不同的vuser压力(减少,增加),继续增加vuser     
%Disk Write Time这个数值与响应时间有什么关系。

问题3 现象:%Disk Write Time高,但响应时间缺低

不一定有关系。这是磁盘用在写入的时间。如果这个值高,说明系统写操作时间比较久。另外,磁盘读写时间是根据文件大小来适应的,如果大量的是4KB左右的小文件,那么每秒可能1Mb都不到。
磁盘写入时间较久,跟响应时间并没有一定的联系关系。你要晓得这段程序实现的算法是什么,是IO型,还是CPU型,或者内存型。磁盘用在写入时间较长,也并一定是由于你关注的事务引起的,可能是由于其它引起的,而这个程序如果是内存型应用,那么可能会很快。

问题4 锁请求多,响应时间一定高吗?

现象:Lock Request/ sec(个数/ 秒):修改前锁请求峰值出现在知识点内容查看的操作中,修改后锁请求峰值只出现在用户登录阶段,之后锁请求明显减小。虽然修改后的版本锁请求数值仍然比较大,但相对修改前锁请求峰值减小了 4倍。

关于锁请求这个我还没有搞清楚,锁请求,好像是数据库内部为了解决并发时数据一致性而采用的一种控制方式,锁请求多,不一定会导致响应时间快,这得看数据库的处理能力,主要得看锁等待时间,即等待锁释放掉的时间,如果释放得很快,当然很快。当然,如果锁请求少,那么比较等待锁释放的时间也就更快,故响应时间快。


问题4:Loadrunner 在运行200个用户的时候会报Failed to stop, reason timeout    但是10个用户没问题  大家知道是什么原因吗?   
    
     可能原因:设置超时长一些,估计是你的程序问题,无法响应过多用户 


问题5:在LR上我们可以看到%disktime超过100%的现象.
如果机器处在很忙的状态,这个值有可能会超过100%,比如,复制大量的文件.

原因:

出现这种现象的原因是处理器允许操作系统使用重叠的I/O,磁盘性能计数器使用一个100纳秒精度的计数器来度量磁盘时间,再按照采样频率显示出来.采样后的时间可能会超过100%,比如:在2毫秒内有10个请求,采样时间为10毫秒.如果是raid磁盘,因为操作系统可以读写到多到磁盘上,从而产生重叠 I/O,这会使%disk time大于100%.

其实:

要度量磁盘时间及磁盘延迟的问题,可以用以下几个计数器来看,通常情况下,如果以下几个计数器之一的值有大于20毫秒的话,磁盘就是超负荷了.
•        Avg.Disk sec/Read
•        avg.Disk sec / Write
•        Avg.Disk sec/Transfer

问题6:假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。
    
    如果:T1 + T3 远大于 T2,则可以采用连接池,以提高服务器性能。


问题:web_set_certificate_ex 这个函数怎么用,CertFilePath  KeyFilePath,这两个参数怎么填?怎么看我装了几个证书?

答:The web_set_certificate is intended to be used for only one connection to a server. This article describes how to use this function for one more than connection in a single script.

The function web_set_certificate specifies the number of a certificate within the list of certificates. The specified certificate is then used whenever a secure Web server requires the client to present a certificate. In some cases, there is more the same connection can be shared among different servers. If you use the function web_set_certificate for the same connection specifying a different certificate number, the changes will not take effect since this function will work on new opened connections only.

In order to use a different certificate specified in the function web_set_certificate for the same connection to the server, include the following function at the beginning of the script:

web_set_sockets_option ("CLOSE_KEEPALIVE_CONNECTIONS","1");
启动IE,打开'工具>Interner选项',进入'内容'标签页,点击'证书'按钮
web_set_certificate_ex("CertIndex=1",
        LAST);
把证书下载到本地,然后复制进LR的文件夹中。

问题7:如果在某时刻iis的cpu使用减低,而数据库cpu使用增大说明了什么?
回答:不存在必然联系,可能数据库此时处理SQL较多,或者编译大量SQL。(可能表现为SQL执行时间较长,其执行的结果还没有返回到IIS)

问题8:同一场景 第一次执行的时候又500的错误,提示超时,连接池的一些信息,但重新执行没有错误
回答:连接池设置过少或释放问题,可以重新启动服务。重新设置,观察连接数的变化,到多少时候出现这种情况。


问题9:linux报下面的错误

ull thread dump Java HotSpot(TM) 64-Bit Server VM (10.0-b23 mixed mode):

"http-6080-136" daemon prio=10 tid=0x00002aab583eb000 nid=0x6e9f in Object.wait() [0x000000004ed8d000..0x000000004ed8dc10]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
- locked <0x00002aaad01e8978> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:619)

"http-6080-135" daemon prio=10 tid=0x00002aab583e9800 nid=0x6e9e waiting for monitor entry [0x000000004ec8c000..0x000000004ec8cb90]
   java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.PrintStream.println(PrintStream.java:755)
- waiting to lock <0x00002aaace1fffa0> (a java.io.PrintStream)
at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:238)
at com.ue.log.LogManager.debug(SourceFile:68)
at com.aceona.hessian.impl.PostSearchServiceImpl.getAllCounts(PostSearchServiceImpl.java:273)
at com.aceona.hessian.impl.PostSearchServiceImpl.getCountsData(PostSearchServiceImpl.java:96)
at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

回答:waiting for monitor entry [0x000000004ec8c000..0x000000004ec8cb90]
   java.lang.Thread.State: BLOCKED (on object monitor) 线程阻塞,看看是不是有大量的请求。

问题10:请教个问题:我看到资料显示,Apache是一款老牌的Web服务器软件,在高并发时对队列的处理比FastCGI更成熟,Apache的mod_php效率比php-cgi更高且更稳定、对伪静态支持好。
那为什么我们平常还提倡使用apache+fastcgi-fpm这样的方式呢?还是我哪里理解错了?求教

回答:从产品对比上来说,apache在高并发的情况下,对于队列的维护优于fastcgi,Apache的mod_php效率比php-cgi更高且更稳定、对伪静态支持好,不需要转换、多用户多站点权限等方面有着更好的效果,单独使用Apache处理静态页面时,对内存的占用远远超过Nginx。引入nginx,一个是弥补apache在静态资源处理上的不足,另外,使用fastcgi的方式,如果是nginx+fastcgi的方式,则容易出现502的错误,而使用apache则相对会减少这样的风险(为什么会,还不了解),所以业界现在更多的在采用LNMPA

问题11:因为各个事物在执行了34分钟之后响应时间出现峰值,并且之后报大量的500错误

日志:

11:56开始执行测试。

------------------------------软件错误------日期:2012/8/1 12:02:59------------------------
Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

12:31开发到测试环境重启的服务,改了连接池的大小

但是之后再运行系统报这个错误。


------------------------------软件错误------日期:2012/8/1 12:35:59------------------------
ORA-03113: 通信通道的文件结尾进程 ID: 4922 会话 ID: 89 序列号: 1268
日志信息:System.Data.OracleClient.OracleException (0x80131938): ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

   at System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
   at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
   at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
   at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OracleClient.OracleConnection.Open()
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection()
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetWrappedConnection()
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetOpenConnection()
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.LoadDataSet(DbCommand command, DataSet dataSet, String[] tableNames)
   at Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDatabase.LoadDataSet(DbCommand command, DataSet dataSet, String[] tableNames)
   at Microsoft.Practices.EnterpriseLibrary.Data.Database.LoadDataSet(DbCommand command, DataSet dataSet, String tableName)
   at GTA.DC.Common.DBUtility.OracleDbHelper.LoadDataSetQuery(String connectionString, CommandType cmdType, String cmdText, OracleParameter[] commandParameters)
   at GTA.DC.Input.Oracle.DAL.InputMgrDAL.GetCheckRule(String tbID)
   at GTA.DC.Input.BLL.InputMgrBLL.GetCheckRule(String tbID)
上下文信息:

后续的所有请求都失败。

---软件错误------日期:2012/8/1 12:35:59------------------------
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
at System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
可能原因: OracleConnection会检测连接字符串,如果是一模一样的连接字符串那么它会做一定优化,缓存,(连接池)。于是你在执行前面第5行时反而没有反应,到真正执行语句时才进行真正的连接。于是出错
解决方法 :将OracleConnection连接的方式改为OleDBConnection。但是,oracleConnection的连接性能要比oleDBConnection好很多。oracleConnection的Bug:http://www.cnblogs.com/tongzhenhua/archive/2004/06/18/17009.html
重现方式:
1)在正常环境下运行程序,程序正常执行。这段程序被执行至少一次。
2)拔掉网线。这段程序再次被定时执行时发生错误。
3)再插上网线,这段程序依然会出错。
参考:http://topic.csdn.net/t/20051123/00/4411551.html


问题12:LR可以做到 每个用户一个session的回传吗?php会自动回传一个php sessionid,然后为了区分用户这个session会存在缓存里每次请求头里会包含这个session,服务器就知道这个用户又操作了  会刷新过期时间,现在是用LR模拟创建这个session的过程
回答:如果返回的这个值 在set-cookies的响应头中,LR就会帮你在下一个请求带了这个值,可以的,但你不能每次都模拟一个新用户;这个选项不能勾。
继续判断的方法:
1.扩展日志的,高级别;看看请求头发了什么
2.如果没有发 ,那就自己进行关联,然后web_set_cookies


问题13:Legend中的Scale为1000,值为0.074,但是图中显示的Y轴最高值为74,为什么两者不一样
答:为了在图示中显示为了放大图示的效果,所以将scale的标尺扩大为1000。换句话为图示中的74/1000,即为下面表格的值。可以使用Configer measurements中的set scale 1 for all measurements功能,将标尺设为1,这样两者的值显示的就是一样了。



问题14:我本次执行测试有时会出现500的问题,有时又不出现这个错误,查看后台日志报下面的错误。
Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  
This may have occurred because all pooled connections were in use and max pool size was reached.
分析:
服务器报应用连接池满,脚本只有2种情况才会这样:
1.大量的vuser,超过了他的限制。这种情况表现,一般在所有vuser加压后出现500错误。
2.由于你启用了sinulate a new user on each iteration,每次迭代没有重新使用旧有的session,新启的session快速地填充了服务端。这种情况一般表现在压力持续了一段时间之后。
除此以外,应该是连接池设置的问题。

最终原因:以前的连接池设置过大为(1000),改为100现象消除。

问题15:测试发现当并发数达到25左右的时间,系统总是会随机返回:Server "192.168.100.204" has shut down the connection prematurely(服务器关闭了连接) 的错误信息,但服务器资

源几乎没有消耗,经判定这个错误应该是:最大线程池的设置过小造成的

解决:线程池设置过小(20),改为(60)解决。

问题16:GET和POST的区别


答:

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

问题17:HI,各位,咨询个问题,nginx里面的worker_connection每个进程允许的最大并发连接数,是说的单个nginx 进程能够允许的最大并发连接数?

回答:配置文件,有个初始进程数和最大数据数,只要没有达到,就一直是初始化时的进程数

问题17:我有一个java客户端用LR这种方式LR不能弹出窗体

我用的winsocket通信模式。

解决:将文件复制到目录的jre\bin文件下,录制安装程序启动为javaw.exe,将启动参数设置为-jar+测试程序的名称。


问题18:Error : Host socket0 is unknown. Error code : 9008

解决:将电脑名改成具体的IP


问题19:只有某个时间点,磁盘使用79%,其它时间忽略,日志文件累计已达1.5G。而此时可用内存还有3GB。但是应用服务报内存泄露。 开发说是写日志文件造成的19

,有道理没?

回答:
如果是说是程序自己控制,先写一个内存buff,再落地,然后不回收,就会泄露了,只见过因为写日志太慢,导致日志内容缓存到内存里面,导致空闲内存为0.

问题20:
 1.1.1. keepalive_requests
语法:keepalive_requests number
默认值:keepalive_requests 100
范围:http, server, location
解释:服务器保持长连接的请求数,当一个长连接中的第number个请求应答之后,服务器主动关闭连接


问题21:
 java.net.SocketException: Broken pipe

at java.net.SocketOutputStream.socketWrite0(Native Method)

一般出现在linux服务器上,常常由于网络不稳定或者服务器负荷过大,管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。 以下是UNIX的信号解释: 11 / SIGSEGV: Unerlaubter Zugriff auf Hauptspeicher (Adressfehler). 12 / SIGUSER2: User-defined Signal 2 (POSIX). 把_JAVA_SR_SIGNUM改成12只是将信号至成user-defined,让它不报出来而已,不能解决问题。 建议采取的方式: 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那美那美

失业了,写文章求吃碗炒面

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值