51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 5293|回复: 17
打印 上一主题 下一主题

[原创] 事务数与实际入库结果不一致的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-12-13 18:10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能作为DLL封装调用,在脚本中设定一投注事务,该事务是往数据库中插入数据,调试全部成功。当设定场景Vuser为1,思考时间为0,运行10分钟后,事务通过数量为40220,数据库中的数据也是40220,该过程无错误提示。

初始化数据后,Vuser设置为50,思考时间为1,运行6分钟后,事务通过数量为3819,数据库中的数据也是3068,该过程无错误提示。成功入库率的只有80%,这一情况反映了实际入库的结果与事务通过数量不符。
后Vsuer设为100,继续测试,仍然不符。

因此看来,LR的事务与实际业务并不是强制一一对应的关系。有可能事务处理成功,但实际业务会遇到一些问题,可不知道如何下手去判断问题出在哪里,希望再此讨论。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2011-12-14 09:42:05 | 只看该作者
是的,lr的事物pass是代表在特定的时间内服务响应,有数据返回,是物理上的pass,而你数据库中数据是需要逻辑上pass才能成功插入。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2014-10-16 09:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
    发表于 2011-12-14 10:31:15 | 只看该作者
    LS 说的好,学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
     楼主| 发表于 2011-12-14 13:51:13 | 只看该作者
    本帖最后由 wensy 于 2011-12-14 14:00 编辑

    按照二楼的理解,这种不一致性应该算是正常的情况了,而不应该算作是一种瓶颈?!

    可是这仍将带来一些疑问。。如果实际使用情况真是如测试预期所料,大量的事务并发投出,是不是数据库一样有不一致的入库结果呢?这难道还能说是正常的么?

    在实际测试中,事务先被触发,然后触发的事务再触发业务逻辑,这业务逻辑就是写入数据库的操作。我想知道,前者完成而后者未完成,这种现象是被快速的事务循环迭代了(不同的事务触发了同一业务逻辑)么?触发的业务逻辑没有跟上事务触发的步伐么?需要进一步的确认。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
    发表于 2011-12-14 14:12:55 | 只看该作者
    我觉得这不是正常也不是异常
    我也遇到过楼主的问题,因为vuser数的本质是执行脚本的线程数,并且由于基准测试中是没问题的,所以我可以暂时相信lr确实执行过脚本的
    所以,我首先从业务角度和数据库限制考虑,例如线程中并发情况:比如1线程执行成功100%,10线程执行成功90%,这样的随着线程数的提高,成功率反而降低,是否考虑过“并发”的问题?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
     楼主| 发表于 2011-12-14 14:46:30 | 只看该作者
    to mr.bee
    你说的这种情况,是的确存在。每当我增加Vuser的数量,成功率反而降低。从我的例子中可以看出,只有在我做Vuser为1的时候,即使没有思考时间,插入数据量非常巨大以及迅速的时候,它们仍然是一致的(事务数和入库结果),这验证了你的说法。
    由于是使用DLL封装了一个投注功能,我用的连接协议是Win Socket,运行Vuser的方式是以进程的方式,而不是线程。这是因为线程的连接总是有连接10054的错误(socket0 - Connection reset by peer. Error code : 10054),后改为进程模式,有了明显的改善。其中,对数据库服务器SQLServer的监控表明,User Connection的值总是25,即便我用200个Vuser的时候也是一样的。
    这样,我就会又有一些怀疑出现了,是不是SQLServer总是在用一些固定的进程或线程接收我的请求呢?而不是随之加大?又或者是我的应用本身就定义了这种进程或线程的模式?
    貌似问题开始清晰和明了了很多。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
     楼主| 发表于 2011-12-14 15:01:43 | 只看该作者
    to mr.bee
    你所说的这种情况是存在的。根据测试的情况就是这样,随着Vuser的数量越多,事务数量与入库的结果差距就会越大。以我的测试为依据,当Vuser为1时,即使没有思考时间,快速的出票也能导致快速的入库。但若换成是Vuser50或提高至100,设置相应的思考时间,出票没有那么迅速了,但实际入库结果却出现了误差。

    由于是封装的DLL实现出票功能,故使用Win Socket的协议进行的脚本。我没有使用线程的方式运行的Vuser,而是使用进程。这是因为在使用线程的时候总是会报10054错误(socket0 - Connection reset by peer. Error code : 10054)。

    有一点值得注意,在测试的监控过程中,我发现SQLServer数据库的User connection指标一直保持为25,无论Vuser是50还是100,通过对数据库的查看,Running的活动连接数也仅仅为1个。这让我很是不解。难道是我的应用本身对SQLServer限制住了进程或线程的使用么?按照这样去设想,无论多少的事务同时触发,都会由固定的线程或进程去处理,导致Vuser越多,事务数量与实际结果差异越大的可能。这似乎证实了这一现状。
    貌似问题越来越清晰起来。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2011-12-14 15:39:34 | 只看该作者
    回复 7# wensy


        那就好
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
     楼主| 发表于 2011-12-15 17:50:32 | 只看该作者
    继续深入的分析这个问题,想必没有那么简单。
    当前能够得出的结论是,事务成功,数据丢失。这一现象伴随两个参数成正比,1是并发用户数,2是思考时间。
    这两个参数越高,丢失率就越高。
    并发数量的增多,会带来这样的问题,不难理解。但思考时间的延长为何也会出现这样的情况呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2011-12-16 09:19:35 | 只看该作者
    回复 9# wensy


        不知道楼主提出“思考时间”是做过什么样子的对比呢?同vuser下,思考按照50%回放和100%回放和150%,丢失率是呈现增长趋势么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-10-16 09:54
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    11#
    发表于 2011-12-16 10:12:38 | 只看该作者
    关注
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2011-12-16 10:29:39 | 只看该作者
    不有分说,找开发分析问题,很大程度上是程序写的有问题,建议让开发在程序里加插入成功信息标志,加异常显示信息,然后楼主再执行并发。

    这种情况本人也遇到很多了,有时程序同步没控制好,有时是程序里创建socket问题,关于通讯的程序你最好别太相信开发,并发、多线程的问题经验多开发人员也是很难控制的。
    你这边LR可以加调用dll信息,记录你执行了多少次调用操作,他那边加插入成功标志,两边对比,还有就是要分析你给参数的方式等等
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
     楼主| 发表于 2011-12-16 11:39:40 | 只看该作者
    回复 10# mr.bee

    是的,肯定是经过对比才得出的结论。
    举例:如果是100Vuser并发执行,开始的ThinkTime 为1s,执行结果发现成功率是80%的比例。
    调整ThinkTime 为3s,成功率只有62%
    但是,我将思考时间注释掉,执行结果成功率为95%的比例。

    这类的样本同样的在150,200的Vuser上进行,得出了相一致的结论
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2011-12-19 21:23:06 | 只看该作者
    个人觉得很可能是楼主检查点设置问题。如果没有检查点,LR是根据请求是否有响应来判断事务是成功还是失败,比如说:web协议返回HTTP200状态码LR会让事务通过。如果你设置了检查点,他会根据你设置的检查点来判断是否成功。   你的检查点是否完全设置正确了呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2011-12-23 17:46:46 | 只看该作者
    功能作为DLL封装调用,在脚本中设定一投注事务,该事务是往数据库中插入数据,调试全部成功。当设定场景Vus ...
    wensy 发表于 2011-12-13 18:10



        loadrunner对结果的正常性不做判定的。建议增加验证点就可以解决这个问题,不同的协议使用方法不一样的。
       如:web_reg_find ; socket  :lrs_save_param("socket1", NULL, "param1", 206, 17);
        当然数据库也有自己的函数验证方法。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2011-12-24 23:02:28 | 只看该作者
    增加检查点,是可以算出事务数.  但我还是不明白,为什么增加了思考时间,反而成功率下降?   

    单纯增加检查点,恐怕还不能足够分析该问题, 需要加debug代码,同时关注数据库等的日志..
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2011-12-26 10:18:21 | 只看该作者
    增加检查点,是可以算出事务数.  但我还是不明白,为什么增加了思考时间,反而成功率下降?   

    单纯增加检查 ...
    nighteblis 发表于 2011-12-24 23:02


    多线程问题不是能推断出规律的!开发人员都不一定搞不清楚多线程并发后回出现什么结果。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
     楼主| 发表于 2011-12-27 15:47:38 | 只看该作者
    本帖最后由 wensy 于 2011-12-27 16:01 编辑

    问题找到,特来结贴
    问题:
    投注事务成功,数据丢失。这一现象伴随两个参数成正比,1是并发用户数,2是思考时间。这两个参数越高,丢失率就越高。
    原因:
    由于投注事务前存在一个登录事务,是登录事务失败导致的。
    解释:
    1、并发用户数越多,登录失败的也就越多,故此投注失败率也就越高
    2、思考时间越长,一部分登录成功的Vuser的投注的频率也就越慢,故失败率越高。
    验证:
    所有用户采用延迟登录(1s),所有投注全部成功。
    LR只认为把事务开始和事务结束作为事务通过的标准,但这并不代表事务实际处理的结果是通过的。有效的打印日志信息将可靠的排除错误和定位错误
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-3 09:51 , Processed in 0.080251 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表