首页 文章 精选 留言 我的

精选列表

搜索[镜像无法拉取],共10000篇文章
优秀的个人博客,低调大师

移动测试 | 解析 Totoro 侵入、全场景截图及图像技术体系

为提高业务研发的开发效率,解决业务基础工具技术痛点,让研发主要精力回归业务核心问题解决上,我们在不同的维度做了大量体系化的技术构建,为不同的自动化场景提供稳定、易用的自动化底盘。 本文主要分享 Totoro 框架在移动端截图及图像处理及在全链路体系上的技术方案和业务支持能力。 基础截图技术方案 一台手机上获取屏幕截图简单,但是想要兼容集群环境云真机平台上的大量移动设备,突破系统各种安全限制、安全页面(密码、转账等页面)反截图安全限制、及 ROM 差异性等不同维度的兼容性问题,且是非侵入方式,则会有一点技术小挑战。 这里从基础截图方案和突破系统限制达到截图能力全场景覆盖两方面分享 Totoro 的一些实践。 1. 一般常见截图方案选型及改造 在移动端自动化(测试)场景, 最长见的截图方法就是使用adb shell screencap或uiaut

优秀的个人博客,低调大师

ServerLess实战:函数计算+NAS搭建服务器thinkphp5

如果太忙都有可能忘记续费主机或者服务器,而且每次买配置过低或者过高都不合适,所以这次用函数计算+NAS搭建无需续费无存储大小限制无需考虑带宽CPU等性能瓶颈,来搭建常用的tp5 先放懒人包下载,详见附件,上传NAS 1、必备条件 A、开通函数计算与NAS服务 B、绑定函数计算域名 C、挂载NAS到同区域节点的ECS上方便文件的复制粘贴修改操作 D、给账户充钱。函数计算和NAS扣费都是后付费,要保证账户余额2、函数计算配置详解 A、选择区域创建服务,要和NAS选择同一区域 B、新建服务、绑定NAS绑定nas的时候写用户不用用他默认的-1,那个读不出来,自己随便定一个ID C、新建函数、编写函数代码 选择HTTP函数,运行环境选择php7.2,触发器选择任何人,其他随意 以下是函数代码, <?php //#自定义的域名,绑定了自定义域名的,可以换成自己自定义的。 $MY_HOST = "你的地址哈3333.cn-cn-hangzhou.fc.aliyuncs.com"; //#web目录,默认是tp5的public目录,绝对路径,如:/code/public $WWW_DIR = '/mnt/think5/public'; function handler($request, $context){ $uri = $request->getAttribute("requestURI"); //return $uri; $file = explode("?", $uri)[0]; if($file=='/') $uri='/'; $file = $GLOBALS['WWW_DIR'].$file; if(file_exists($file) and $uri!='/'){ if(strpos($uri,".php")) return php_run(basename($file), $request, $context);#php_run return static_run($uri);#static_run } $request = $request->withAttribute("requestURI", "?s=".$uri); return php_run('index.php', $request, $context);# php_run } function php_run($name,$request, $context) { return $GLOBALS['fcPhpCgiProxy']->requestPhpCgi($request, $GLOBALS['WWW_DIR'], $name,['SERVER_NAME' => $GLOBALS['MY_HOST'], 'SERVER_PORT' => '80', 'HTTP_HOST' => $GLOBALS['MY_HOST']],['debug_show_cgi_params' => false, 'readWriteTimeout' => 15000]); } use RingCentral\Psr7\Response; function static_run($uri): Response{ $file_dir = $GLOBALS['WWW_DIR'].$uri; #完整文件路径 $file_dir = explode("?", $file_dir)[0]; #去掉动态路径 if(is_dir($file_dir)) $file_dir .= '/index.html';# 可以这里定义目录的默认索引页 $handle = fopen($file_dir, "r"); $contents = fread($handle, filesize($file_dir)); fclose($handle); return new Response(200, ['Content-Type' => $GLOBALS['fcPhpCgiProxy']->getMimeType($file_dir),'Cache-Control' => "max-age=8640000",'Accept-Ranges' => 'bytes'], $contents); } function clearFcHost($request,$context){ $uri = $request->getAttribute("requestURI"); $uri = str_replace("/2016-08-15/proxy/".$context['service']['name']."/".$context['function']['name'],"",$uri); $request = $request->withAttribute("requestURI", $uri); return $request; } D、配置自定义域名 如图: 3、NAS配置详解 在对应目录上传代码包,点击下载,解压缩代码即可4、测试访问 你的域名直接访问 你的域名/index.php?s=index/index/index 你的域名/about 都没问题的话就大功告成

优秀的个人博客,低调大师

案例分享:巧用工具提升源码系统的性能和稳定

导读:在没有核心系统源码的情况下,修改源码打印耗时的方法无法使用,通过tcpdump、wireshark、gdb、010 editor、火焰图、ida、数据库抓sql耗时语句、oracle ash报告、loadrunner等工具找到了服务器tps上不去、C程序进程随机挂掉的问题,并顺利解决,收获颇多。 背景 公司最近新上线一个系统,主要架构如下: 测试环境系统部署后,出现了两个问题: 1.loadrunner压测tps上不去,压测java接口tps 单机只能到100多tps就上不去了,耗时从单次访问的100ms上升到110并发时的1s左右。 压测期间C服务器1 经常不定时挂掉。 因为某些原因,该项目C相关程序没有源码,只有安装部署文件,为了解决上述两个问题,我们几个同事和重庆同事一块参与问题排查和解决。因为没有源码,中间经历了层层波折,经过一个月努力,终于解决了上述两个问题,整个排查过程学到了很多知识。 用到的分析工具 1.tcpdump, 2.wireshark, 3.gdb, 4.010 editor, 5.火焰图, 6.ida, 7.数据库抓sql耗时语句, 8.oracle ash报告, 9.loadrunner 几句话总结 1.C程序客户端socket长连接调用C服务端存在性能瓶颈,通过tcpdump,wireshark 二进制分析出传输协议后改用java调用C服务端,单机tps提升1倍,性能提升3倍 2.数据库语句存在for update 语句导致并发上不去,经过分析从业务上采用sequence 替换for update语句,并通过010 editor直接修改二进制 修改for update 语句相关逻辑为sequence ,系统具备了扩容服务器tps也能同步提升的能力 3.数据库insert语句并发情况下存在瓶颈,扩大oracle redo log日志大小解决,继续提升tps40%。 4.程序进程随机挂掉,通过gdb分析core dump文件,定位到在并发情况下程序中使用的gethostbyname有问题,采用临时方法解决。 分析过程 1.第一次瓶颈定位 刚开始排查问题时,loadrunner压测java接口,并发用户从0逐渐增加到110个的情况下,tps到100左右就不再提升,响应耗时从100ms增大到1s。此时我们的分析重点是谁是当前的主要瓶颈 再看一遍架构图, 图中5个节点都有可能是瓶颈点,数据库此时我们通过数据库dba管理权限抓取耗时sql,没抓取到,先排除数据库问题,java的我们打印分步耗时日志,定位到jni调用 c客户端耗时占比最大。这时瓶颈点初步定位到C客户端,C服务端1,C服务端2 这三个节点。 因为没有源码,我们采用tcpdump抓包分析,在C服务器1上 tcpdump -i eth0 -s 0 -w aa.txt host java客户端ip 抓出的包用wireshark分析 通过追踪流-TCP流 分析服务端耗时并没有变的太大,因为C客户端和C服务端是长连接,多个请求可能会共用一个连接,所以此时分析出的数据可能会不太准,因此我们采用loadrunner压测,其它条件不变,一台C服务器1和两台C服务器1分别查看耗时变化, 其它条件不变,一台java服务器和两台java服务器分别查看耗时变化. 最终定位到是C客户端的问题。(ps:在wireshark的分析数据时还跟秦迪大师弄明白了tcp延迟确认) 2.改造C客户端 C客户端和C服务端是通过长连接通信的,直接改造C代码难度较大,所有我们准备把C替换成java,这就需要分析C之间通信传参时候用的什么协议,然后根据这个协议用java重写。我们根据之前的经验推测出了编码协议,用wireshark分析二进制确认确实是这种编码。 我们根据这种协议编码采用java重写后,同样在110并发用户情况下,tps提升到了210(提升两倍),耗时降到了330ms(是原来的三分之一) 3.第二次瓶颈定位。 经过第二步优化后tps提升了两倍,但是此时扩容tomcat,扩容C服务器,tps就维持在210左右,不会变高了。因此我们继续进行定位新的瓶颈点。此时找dba要到一个实时查看oracle 耗时sql的语句 select (select b.SQL_TEXT from v$sqlarea b where b.SQL_ID=a.SQL_ID ) sqltxt, (select c.SQL_FULLTEXT from v$sqlarea c where c.SQL_ID=a.SQL_ID ) sqlfulltxt, a.username, a.LAST_CALL_ET,a.MACHINE ,a.command, a.EVENT, a.SQL_ID ,a.SID,a.SERIAL#, 'alter system kill session ''' || a.SID ||','||a.SERIAL# ||''';' as killstment from v$session a where a.STATUS = 'ACTIVE' and a.USERNAME not in ('SYS', 'SYSTEM') order by a.LAST_CALL_ET desc ,a.username,a.MACHINE ,a.command, a.EVENT, a.SQL_ID ,a.SID; 发现有个for update的sql 并发量大的时候部分请求 LAST_CALL_ET列的值能达到6秒,for update导致了所有请求被串行执行,影响了并发能力。我们经过分析业务逻辑后,用sequence暂时替换 for update 语句,但是我们没有源码,没法修改,后来又通过010 editor 直接修改二进制文件,通过010 editor 查询找到了 for update 语句,顺利替换。 替换后,4台C服务器tps达到了580,提升了2.7倍(580/210),系统初步具备了横向扩展能力 4.第三次瓶颈定位。 经过上一步改造,4台C服务器时系统的tps提升了2.7倍,但是并没有提升到4倍(210*4=840),没有线性提升,说明还是有别的瓶颈,又通过dba上边给的sql发现insert 语句偶尔耗时也很长,在1s左右,EVENT等待事件是IO事件,DBA同事给修改了redo log file 大小(这个是测试环境Oracle,之前没有优化),从默认的50M,修改为1G, tps 提升到了640 (还没提升到4倍,也就是说还有瓶颈,可能还是数据库,但因为数据库暂时没办法抓取到毫秒级的耗时sql,没再继续追查) 经过这几次性能提升,加上我们测试服务器配置都不高,如果线上服务器性能预估能达到1000tps,基本满足眼前需求,因此就没再继续进行性能优化。 5.程序进程随机挂掉问题。 压测过程中,C服务器进程经常随机挂掉,通过tail -f /var/log/messages 发现生成了core dump 文件,但是又被系统自动删除了。董建查到了开启core dupm文件的方法,如下: a、ulimit -c 查看是否为0,如果为0,表示coredump文件设置为0,需要修改为不限制 ulimit -c unlimited b、修改/etc/abrt/abrt-action-save-package-data.conf ProcessUnpackaged = yes 修改后进程又崩溃时core dump 文件生成了,进入core dump 目录进行调试 gdb 脚本路径 coredump bt 显示堆栈信息 继续执行如下命令 f 0 set print pretty on info local //显示当前函数中的局部变量信息。 通过p命令查看里边变量的值 发现变量thishost->h_addr_list的值为null 我们分析可能是并发请求时有方法不是线程安全的导致这个值为null,从而引起了进程crash,继续调试。 在gdb中 set logging on 把调试信息输出到文件 thread apply all bt 输出所有的线程信息。 退出gdb grep --color -i clientconnect -C5 gdb.txt 确实有两个线程并发在访问 通过ida工具反编译so,最终定位到以下语句在并发时有问题,thishost中的变量可能会被另一个线程在一瞬间初始化为null。 thishost = gethostbyname((const char *)hostname); ip = inet_ntoa(*(struct in_addr *)*thishost->h_addr_list); 根据我们的项目特点,因为我们没有远程调用,C服务端1和C服务端2都部署在了同一台服务器上,所以我们通过修改二进制把地址暂时写死成了127.0.0.1,把ip = inet_ntoa((struct in_addr )*thishost->h_addr_list);修改成了空指令,重新部署后没再出现系统崩溃的问题。 作者简介:杨振-宜信工程师,前微博feed组工程师,对源码学习感兴趣;董建-宜信工程师,前微博工程师,关注大数据和高可用技术 原文发布于 高可用架构 来源:宜信技术学院

优秀的个人博客,低调大师

关于Android 项目从svn中检出R.java文件问题

昨天在做一个Android项目的时候遇到了一个这样的问题 就是从SVN检出的Android项目gen目录下为空 整个就导致项目没法运行 花了挺长时间去找这个问题的解决办法 而网上类似的解决办法倒是挺多 但是没有一个适用于我遇到的情况 今天早上自己又不懈的试了一试 终于把这个问题的解决办法找到了 网上的大多数解决办法也是对的 但是他们忽略了一个*前提条件* 解决办法: 首先要确保从SVN检出的项目必须是在本地新建一个存放目录,如下图 再将服务器上的项目检出到此新建目录下(保证了这个前提之后,网上说的大部分方法才有尝试的可能)。 针对我的情况,就是为了让项目再自动生成一下R.java文件 然后我使用了多数帖子都提到的Eclipse->project->clean 这时发现gen目录下还是空空如也 不过不要担心,这时关了Eclipse重启一下再看看gen目录吧! 希望能帮助到有需要的人。 本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1376553,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册