1.线程池newCachedThreadPool
2.OkHttp3源码详解之 okhttp连接池复用机制(一)
3.SWD协议分析(附SWD离线下载源码)
4.php技术是闲置下载闲置下载什么意思(php技术课程是什么php开发技术机构)
5.游戏引擎随笔 0x36:UE5.x Nanite 源码解析之可编程光栅化(下)
6.ç¨åºåå¯ä»¥åå¯ä¸çå 个ç½ç«
线程池newCachedThreadPool
新线程池newCachedThreadPool的源码揭示了其独特设计和功能。它的源码源码核心特点在于动态创建和重用线程,以提高执行短暂异步任务的什软程序性能。此池允许在先前构造的闲置下载闲置下载线程可用时重复使用它们,且最大线程数为Integer.MAX_VALUE,源码源码意味着资源使用相对灵活。什软mysuper下载源码
在newCachedThreadPool中,闲置下载闲置下载线程的源码源码存活时间设置为秒,超过此时间未使用的什软线程将被终止并从池中移除。这一特性有助于避免资源浪费,闲置下载闲置下载保持空闲时间足够长的源码源码池不会消耗任何资源。此外,什软新线程池不包含核心线程,闲置下载闲置下载其操作基于SynchronousQueue队列,源码源码确保线程间高效同步。什软
使用newCachedThreadPool时,程序执行到大约秒后自动终止,因为线程池已完成所有任务。存活线程在超过秒的闲置后被终止和移除,这体现了其设计原理。
为何newCachedThreadPool选择SynchronousQueue而不是其他线程池通常采用的LinkedBlockQueue?SynchronousQueue是一个特殊的阻塞队列,旨在实现线程间高效同步。它没有内部容量,且插入操作需等待相应的删除操作。此特性使其成为切换设计的理想选择,允许线程在需要时安全地传递信息、事件或任务,尤其适用于需要多线程间同步的应用场景。
SynchronousQueue通过实现Collection和Iterator接口支持所有可选方法,包括支持可选的公平性策略。默认情况下,不保证生产者和使用者线程的FIFO顺序访问,但通过将公平性策略设置为true,可以确保按此顺序授予访问权限。
总之,newCachedThreadPool通过动态线程重用和SynchronousQueue的高效同步机制,提供了一种灵活且高效的处理短暂异步任务的方法。其设计旨在优化资源使用,通过在任务完成后的秒内自动清理资源,保持系统性能高效。
OkHttp3源码详解之 oktl和posix编程,这里涉及到了异步编程逻辑,这块难度还是比较大的。比较常用的模式是结合swoole组件编写cli框架。
PHP是一个活跃的社区开发语言,有专业的核心开发团队在持续不断的迭代,最近一个版本就是PHP8.0.8引入了很多的新特性。
语言参考:
内置函数
PHP有很多标准的函数和结构。还有一些函数需要和特定的扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。例如,要使用image函数中的imagecreatetrue,需要在编译PHP的时候加上GD的支持。或者要使用mysqli_connect函数,就需要在编译PHP的时候加上MySQLi支持。有很多核心函数已包含在每个版本的blog源码免费PHP中如字符串和变量函数。调用phpinfo或者get_loaded_extensions可以得知PHP加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。
静态网站与动态网站的区别
静态网站:web1.0时代
动态网站:web2.0时代
静态网站特点:
1、网页内容一经发布到网站服务器,无论是否有用户访问,每个静态页面的内容都是保存在网站服务器上的。也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件。
2、静态网页的内容相对稳定,因此容易被搜索引擎检索。
3、静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难。
4、静态网页的交互性较差,在功能方面有较大的限制。
动态网站特点:
1、交互性:网页会根据用户的要求和选择而动态地改变和响应,浏览器作为客户端,成为一个动态交流的桥梁,动态网页的交互性也是今后web发展的潮流。
2、自动更新:即无须手动更新HTML文档,便会自动生成新页面,可以大大节省工作量
3、因时因人而异:即当不同时间、不同用户访问同一网址时会出现不同页面。
动态网页是与静态网页相对应的,静态网页的后缀是以.htm,.html,.shtml,.xml,动态网页的后缀是以.asp,.jsp,.php,.perl,cgi等形式。在动态网页网址中有一个标志性的符号"?"
什么是PHP,PHP能干什么,为什么使用PHP
什么是PHP,PHP能干什么,为什么使用PHP
在学习任何东西之前,我们都得了解这门东西究竟是什么,有什么用。学习PHP一样如此。
一、什么是PHP
PHP,全称HypertextPreprocessor,中文翻译“超文字前处理器”。
在PHP的官网是这样介绍PHP的:
PHPisapopulargeneral-purposescriptinglanguagethatisespeciallysuitedtowebdevelopment.
Fast,flexibleandpragmatic,PHPpowerseverythingfromyourblogtothemostpopularwebsitesintheworld.
照顾英文能力较差的同学,以下为中文版
PHP是一种被广泛应用的开源通用指令码语言,尤其适用于Web开发。
拥有快速,灵活,实用的特点,PHP能做任何事,包括你的个人部落格甚至是全球性的大型站点系统。
PHP核心由C开发,deb 打包源码因此在语法上跟C有不少相似之处。但PHP绝对不是C。
PHP语法除了跟C有相似之处外,还跟Java、Perl比较流行的程式语言存在相似的地方。因此,如果你有上述语言基础,PHP入门会更加快速。
二、PHP能干什么
PHP能干任何事!
PHP能直接嵌入HTML语言中,与HTML混编。PHP开发的目的主要是允许web开发人员快速编写动态生成的web页面,但PHP的用途远不只于此。
PHP还包含了命令列执行介面(mandlineinterface),和产生图形使用者介面(GUI)程式。
PHP能干任何事!
PHP能干任何事!
PHP能干任何事!
重要的事情要说3遍!
三、为什么选择PHP
1、PHP开源免费,没有任何收费的专案。你可以随便修改他的核心然后用于自己的商业使用。
2.、PHP开发元件丰富(对于新手来说一堆IDE也是够选择困难症纠结的)
3、社群成熟,%以上的问题能在社群找到相应的解决思路。
4、PHP学习成本低,不想某门语言要学就得三件套。见效快,学1个月基本能入门
5、开源库丰富,基本所有型别均有开源产品
6、PHP7.0基本不输任何一门语言~!这是重点
7、与MySQL近乎完美的支援
8、找工作容易
9、连Facebook都在用php,你还什么理由不用?
php能干什么
利用PHP技术应用而开发的网页自动生成工具,不仅可以作为自助建站的平台,同时也可以作为网站管理系统。它的资料更新很大程度上能满足使用者的"个性化需求",即在内容上和风格上接近使用者所想,该系统完全图形视觉化,即使不懂制作网页的专门技术,不懂HTML语言,通过对该系统中如栏目、模板设定、网站关键字、功能模组等进行引数设定,使用者也可以用它轻松地制作出千变万化、色彩丰富的发布asp源码网站。
为什么使用PHP?
为什么使用PHP?
PHP运行于各种平台(Windows,Linux,Unix,MacOSX等等)
PHP相容几乎所有伺服器(Apache,IIS等等)
PHP支援多种资料库
PHP是免费的。请从官方PHP资源下载:php.
PHP易于学习,并可高效地执行在伺服器端
PHP为什么使用array
1使用array_map可以简单搞定PHP删除档案、删除目录
2.具体程式码如下:
php删除目录下所有空目录
array_map('rmdir',glob('*',GLOB_ONLYDIR));
删除目录所有档案
array_map('unlink',array_filter(glob('*'),'is_file'));
3.$data=array(
array(
'a'='firsta',
'b'='firstb'
),
array(
'a'='seconda',
'b'='secondb'
)
);
$array_column=array_map(function($element){
return$element['a'];
},$data);
print_r($array_column);
为什么使用templateenginephp
PHP是一种HTML内嵌式的在伺服器端执行的指令码语言,所以大部分PHP开发出来的Web应用,初始的开发模板就是混合层的资料程式设计。虽然通过MVC设计模式可以把程式应用逻辑与网页呈现逻辑强制性分离,但也只是将应用程式的输入、处理和输出分开,网页呈现逻辑(检视)还会有HTML程式码和PHP程式强耦合在一起。
php可以干什么?
你是初学者吧。我开始学的时候也是这样。不知道这个是干嘛的,我哥哥当时拉我一起去了北京的兄弟连,当时和我一样不知道这个是干嘛的人很多,但是我真心不想告诉你,我现在一个月有5K以上的工资。
php是程式语言,做网站,做程式都可以,不过它做网站能发挥它的长处,应用程式的话呢还是用Java、.好些
php为什么使用hessian和curl
这个应用可以使用JavaConfig完成配置。我把它切分为下面几个部分:
ServicesConfig(服务配置)
无需扫描元件,配置真的非常简单:
@Configuration
publicclassServicesConfig{
@Autowired
privateAountRepositoryaountRepository;
@Bean
publicUserServiceuserService(){
returnnewUserService(aountRepository);
}
php-fpm为什么使用socket
1、在配置档案/usr/local/php/etc/php-fpm.conf档案中找到
valuename="listen_address".0.0.1:/value
改为
valuename=listen_address/var/run/phpfpm.sock/value
重启php-fpm
/usr/local/php/***in/php-fpmrestart
2、配置nginx
在/usr/local/nginx/conf/nginx.conf中找到
fastcgi_pass.0.0.1:;
改为
fastcgi_passunix:/var/run/phpfpm.sock;
重启nginx
/usr/local/nginx/***in/nginx-sreload
试试吧我刚在后盾网问的讲师相关知识,我加上自己的理解,希望能帮到你(づ●─●)づ
在PHP中,为什么使用mb
mb打头的函式,都最新新增的,好多要求php5版本
处理速度能更快,功能更强大一些
但也有一些预设是未被开启
没有非说得用mb函式的说法,合适的就是最好的
比如说mb_substr用来撷取中文时不会把一个汉字截断的现象
substr更适合撷取英文内容
但php预设是不支援的,需要在配置中解开
;extension=php_mbstring.dll
什么是pHp技术PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP。[1]
php编程技术
PHP代表:超文本预处理器(PHP:HypertextPreprocessor)。PHP是完全免费的,不用花钱,你可以从PHP官方站点自由下载。PHP遵守GNU公共许可(GPL),在这一许可下诞生了许多流行的软件诸如Linux和Emacs。你可以不受限制的获得源码,甚至可以从中加进你自己需要的特色。PHP在大多数Unix平台,GUN/Linux和微软Windows平台上均可以运行。怎样在Windows环境的PC机器或Unix机器上安装PHP的资料可以在PHP官方站点上找到。安装过程很简单。
php是什么技术?PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页。当一个访问者打开主页时,服务端便执行PHP的命令并将执行结果发送至访问者的浏览器中,这类似于ASP和CoildFusion,然而PHP和他们不同之处在于PHP开放源码和跨越平台,PHP可以运行在WINDOWSNT和多种版本的html爬虫源码UNIX上。它不需要任何预先处理而快速反馈结果,它也不需要mod_perl的调整来使您的服务器的内存映象减小。PHP消耗的资源较少,当PHP作为ApacheWeb服务器一部分时,运行代码不需要调用外部二进制程序,服务器不需要承担任何额外的负担。
除了能够操作您的页面外,PHP还能发送HIIP的标题。您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有DBC),集成各种外部库来做用PDF文档解析XML的任何事情。
有了PHP就无需特殊的开发环境和IDE,您可以以?php作为程序块的开始,可以以?作为PHP代码块的结束,当然您也可以用带有%%的标记甚至用scriptLANGUAGE=“php”/script的ASP的格式来配置PHP,PHP会在那些标志间处理所有的事情。
PHP的编程语言类似与C和Perl。在使用它们之前您没必要声明任何变量,而且建立数组和Hash是很简单的事情。PHP还有一些面向对象的特征,可以为组织和打包您的代码提供很好的帮助。
虽然PHP在Apache里能快速运行,但是在PHP网站里有一些用来对MicrosoftIIS和NetscapeEnterpriseSerer无缝结合的指令集。如果您还没有copyPHP的话,您可以在,安全要求高的,比如银行网站这些就采用JSP
游戏引擎随笔 0x:UE5.x Nanite 源码解析之可编程光栅化(下)
书接上回。
在展开正题之前,先做必要的铺垫,解释纳尼特(Nanite)技术方案中的Vertex Reuse Batch。纳尼特在软光栅路径实现机制中,将每个Cluster对应一组线程执行软光栅,每ThreadGroup有个线程。在光栅化三角形时访问三角形顶点数据,但顶点索引范围可能覆盖整个Cluster的个顶点,因此需要在光栅化前完成Cluster顶点变换。纳尼特将变换后的顶点存储于Local Shared Memory(LDS)中,进行组内线程同步,确保所有顶点变换完成,光栅化计算时直接访问LDS,实现软光栅高性能。
然而,在使用PDO(Masked)等像素可编程光栅化时,纳尼特遇到了性能问题。启用PDO或Mask时,可能需要读取Texture,根据读取的Texel决定像素光栅化深度或是否被Discard。读取纹理需计算uv坐标,而uv又需同时计算重心坐标,增加指令数量,降低寄存器使用效率,影响Active Warps数量,降低延迟隐藏能力,导致整体性能下降。复杂材质指令进一步加剧问题。
此外,当Cluster包含多种材质时,同一Cluster中的三角形被重复光栅化多次,尤其是材质仅覆盖少数三角形时,大量线程闲置,浪费GPU计算资源。
为解决这些问题,纳尼特引入基于GPU SIMT/SIMD的Vertex Reuse Batch技术。技术思路如下:将每个Material对应的三角形再次分为每个为一组的Batch,每Batch对应一组线程,每个ThreadGroup有个线程,正好对应一个GPU Warp。利用Wave指令共享所有线程中的变换后的顶点数据,无需LDS,减少寄存器数量,增加Warp占用率,提升整体性能。
Vertex Reuse Batch技术的启用条件由Shader中的NANITE_VERT_REUSE_BATCH宏控制。
预处理阶段,纳尼特在离线时构建Vertex Reuse Batch,核心逻辑在NaniteEncode.cpp中的BuildVertReuseBatches函数。通过遍历Material Range,统计唯一顶点数和三角形数,达到顶点去重和优化性能的目标。
最终,数据被写入FPackedCluster,根据材质数量选择直接或通过ClusterPageData存储Batch信息。Batch数据的Pack策略确保数据对齐和高效存储。
理解Vertex Reuse Batch后,再来回顾Rasterizer Binning的数据:RasterizerBinData和RasterizerBinHeaders。在启用Vertex Reuse Batch时,这两者包含的是Batch相关数据,Visible Index实际指的是Batch Index,而Triangle Range则对应Batch的三角形数量。
当Cluster不超过3个材质时,直接从FPackedCluster中的VertReuseBatchInfo成员读取每个材质对应的BatchCount。有了BatchCount,即可遍历所有Batch获取对应的三角形数量。在Binning阶段的ExportRasterizerBin函数中,根据启用Vertex Reuse Batch的条件调整BatchCount,表示一个Cluster对应一个Batch。
接下来,遍历所有Batch并将其对应的Cluster Index、Triangle Range依次写入到RasterizerBinData Buffer中。启用Vertex Reuse Batch时,通过DecodeVertReuseBatchInfo函数获取Batch对应的三角形数量。对于不超过3个材质的Cluster,DecodeVertReuseBatchInfo直接从Cluster的VertReuseBatchInfo中Unpack出Batch数据,否则从ClusterPageData中根据Batch Offset读取数据。
在Binning阶段的AllocateRasterizerBinCluster中,还会填充Indirect Argument Buffer,将当前Cluster的Batch Count累加,用于硬件光栅化Indirect Draw的Instance参数以及软件光栅化Indirect Dispatch的ThreadGroup参数。这标志着接下来的光栅化Pass中,每个Instance和ThreadGroup对应一个Batch,以Batch为光栅化基本单位。
终于来到了正题:光栅化。本文主要解析启用Vertex Reuse Batch时的软光栅源码,硬件光栅化与之差异不大,此处略过。此外,本文重点解析启用Vertex Reuse Batch时的光栅化源码,对于未启用部分,除可编程光栅化外,与原有固定光栅化版本差异不大,不再详细解释。
CPU端针对硬/软光栅路径的Pass,分别遍历所有Raster Bin进行Indirect Draw/Dispatch。由于Binning阶段GPU中已准备好Draw/Dispatch参数,因此在Indirect Draw/Dispatch时只需设置每个Raster Bin对应的Argument Offset即可。
由于可编程光栅化与材质耦合,导致每个Raster Bin对应的Shader不同,因此每个Raster Bin都需要设置各自的PSO。对于不使用可编程光栅化的Nanite Cluster,即固定光栅化,为不降低原有性能,在Shader中通过两个宏隔绝可编程和固定光栅化的执行路径。
此外,Shader中还包括NANITE_VERT_REUSE_BATCH宏,实现软/硬光栅路径、Compute Pipeline、Graphics Pipeline、Mesh Shader、Primitive Shader与材质结合生成对应的Permutation。这部分代码冗长繁琐,不再详细列出讲解,建议自行阅读源码。
GPU端软光栅入口函数依旧是MicropolyRasterize,线程组数量则根据是否启用Vertex Reuse Batch决定。
首先判断是否使用Rasterizer Binning渲染标记,启用时根据VisibleIndex从Binning阶段生成的RasterizerBinHeaders和RasterizerBinData Buffer中获取对应的Cluster Index和光栅化三角形的起始范围。当启用Vertex Reuse Batch,这个范围是Batch而非Cluster对应的范围。
在软光栅中,每线程计算任务分为三步。第一步利用Wave指令共享所有线程中的Vertex Attribute,线程数设置为Warp的Size,目前为,每个Lane变换一个顶点,最多变换个顶点。由于三角形往往共用顶点,直接根据LaneID访问顶点可能重复,为确保每个Warp中的每个Lane处理唯一的顶点,需要去重并返回当前Lane需要处理的唯一顶点索引,通过DeduplicateVertIndexes函数实现。同时返回当前Lane对应的三角形顶点索引,用于三角形设置和光栅化步骤。
获得唯一顶点索引后,进行三角形设置。这里代码与之前基本一致,只是写成模板函数,将Sub Pixel放大倍数SubpixelSamples和是否背面剔除bBackFaceCull作为模板参数,通过使用HLSL 语法实现。
最后是光栅化三角形写入像素。在Virtual Shadow Map等支持Nanite的场景下,定义模板结构TNaniteWritePixel来实现不同应用环境下Nanite光栅化Pipeline的细微差异。
在ENABLE_EARLY_Z_TEST宏定义时,调用EarlyDepthTest函数提前剔除像素,减少后续重心坐标计算开销。当启用NANITE_PIXEL_PROGRAMMABLE宏时,可以使用此机制提前剔除像素。
最后重点解析前面提到的DeduplicateVertIndexes函数。
DeduplicateVertIndexes函数给每个Lane返回唯一的顶点索引,同时给当前Lane分配三角形顶点索引以及去重后的顶点数量。
首先通过DecodeTriangleIndices获取Cluster Local的三角形顶点索引,启用Cluster约束时获取所有Lane中最小的顶点索引,即顶点基索引。将当前三角形顶点索引(Cluster Local)减去顶点基索引,得到相对顶点基索引的局部顶点索引。
接下来生成顶点标志位集合。遍历三角形三个顶点,将局部顶点索引按顺序设置到对应位,表示哪些顶点已被使用。每个标志位是顶点的索引,并在已使用的顶点位置处设置为1。使用uint2数据类型,最多表示个顶点位。
考虑Cluster最多有个顶点,为何使用位uint2来保存Vertex Mask而非位?这是由于Nanite在Build时启用了约束机制(宏NANITE_USE_CONSTRAINED_CLUSTERS),该机制保证了Cluster中的三角形顶点索引与当前最大值之差必然小于(宏CONSTRAINED_CLUSTER_CACHE_SIZE),因此,生成的Triangle Batch第一个索引与当前最大值之差将不小于,并且每个Batch最多有个唯一顶点,顶点索引差的最大值为,仅需2个位数据即可。约束机制确保使用更少数据和计算。
将所有Lane所标记三个顶点的Vertex Mask进行位合并,得到当前Wave所有顶点位掩码。通过FindNthSetBit函数找出当前Lane对应的Mask索引,加上顶点基索引得到当前Lane对应的Cluster Local顶点索引。
接下来获取当前Lane对应的三角形的Wave Local的三个顶点索引,用于后续通过Wave指令访问其他Lane中已经计算完成的顶点属性。通过MaskedBitCount函数根据Vertex Mask以及前面局部顶点索引通过前缀求和得到当前Lane对应的Vertex Wave Local Index。
最后统计Vertex Mask所有位,返回总计有效的顶点数量。
注意FindNthSetBit函数,实现Lane与顶点局部索引(减去顶点基索引)的映射,返回当前Lane对应的Vertex Mask中被设置为1的位索引。如果某位为0,则返回下一个位为1的索引。如果Mask中全部位都设置为1,则实际返回为Lane索引。通过二分法逐渐缩小寻找索引范围,不断更新所在位置,最后返回找到的位置索引。
最后,出于验证目的进行了Vertex Reuse Batch的性能测试。在材质包含WPO、PDO或Mask时关闭Vertex Reuse Batch功能,与开启功能做对比。测试场景为由每颗万个三角形的树木组成的森林,使用Nsight Graphics进行Profiling,得到GPU统计数据如下:
启用Vertex Reuse Batch后,软光栅总计耗时减少了1.毫秒。SM Warp总占用率有一定提升。SM内部工作量分布更加均匀,SM Launch的总Warp数量提升了一倍。长短板Stall略有增加,但由于完全消除了由于LDS同步导致的Barrier Stall,总体性能还是有很大幅度的提升。
至此,Nanite可编程光栅化源码解析讲解完毕。回顾整个解析过程,可以发现UE5团队并未使用什么高深的黑科技,而是依靠引擎开发者强悍的工程实现能力完成的,尤其是在充分利用GPU SIMT/SIMD机制榨干机能的同时,保证了功能与极限性能的实现。这种能力和精神,都很值得我们学习。
ç¨åºåå¯ä»¥åå¯ä¸çå 个ç½ç«
ç¨åºåå¯åçå¯ä¸1ãCODINGç å¸
èåçCodingæä¸çäºèç½è½¯ä»¶å¤å æå¡å¹³å°ï¼å¹³å°ä»¥å¤å 为主ã
2ãå¼æºä¼å
å¼æºä¸å½çä¼å å¹³å°ï¼ä¸»è¦æ¯ä»¥ä¼å 为主ã
3ãçªå «æ
æ¾å ¼èçå°æ¹ï¼ä¸»è¦æ¯å ¥é¨çº§é¡¹ç®ï¼ä¸éåä¸ä¸ç¨åºåï¼ä¸é¢åç±»éæ±åå¸é½æä¸éäºè½¯ä»¶å¼åè¡ä¸ï¼æ´éåæ°æã
4ãç¨åºå客æ
ç¨åºåï¼äº§åç»çï¼è®¾è®¡å¸çäºèç½ç¸å ³äººåé½è½å¨ä¸é¢æ¾å°éåèªå·±ç项ç®ãæ¯æèªç±ãè¿ç¨åå ¼èå·¥ä½ï¼è¿å¯ä»¥æééä½£ï¼å·¥ä½æ¨¡å¼é常å¤ã
5.å¼åé¦
ç¹ç¹:æå¡èå´æç¡®ï¼ITå¼å项ç®åç´åº¦é«ï¼è½å¸å¼å°ä¸é¨åéæ±æç¡®ç客æ·ãå¹³å°ä¹è´åäºå©ç¨äºèç½è½¯ä»¶ææ¯ä¸ºå®¢æ·æé«æçãéä½ææ¬ãæåæè½ãä¼å管çã
6ãç¿æ¥é
å¹³å°ç¹ç¹:追æ±é«è´¨éçé主åå·¥ç¨å¸ï¼æ±èäºç¥åäºèç½å ¬å¸çææ¯ã设计ã产å大çï¼éè¿å®é åçãè¿ç¨çæ¹å¼ï¼ä¸å¯¹ä¸ä¸ºåä¸å ¬å¸è§£å³é®é¢ï¼æé«åä¸æçã
7ã人人å¼å
åºäºå¯è§åå¿«éå¼åå¹³å° - æ·å¾(Joget)/æ·å¾äº(Joget Cloud)(PaaS),éä¼å¤å¼åè èµæº,为ä¼ä¸æä¾ä¼ä¸ç®¡ç软件æå¡ã
如何挖掘闲置硬件资源的潜力-PrestoDB缓存加速实践小结
在追求用户体验与成本平衡的挑战中,如何在有限的资源和开发预算下提升系统的性能,成为技术团队面临的棘手问题。面对大数据查询引擎,提高查询速度、优化用户体验是首要任务。缓存技术,因其能有效减少外部系统交互,加速数据访问,成为提升性能的关键策略。
挖掘服务器闲置资源潜力,通过评估CPU利用率,发现内存和本地磁盘等资源的空闲状态,进而利用这些资源,可以显著提升系统性能。选择开源社区广泛实践、案例丰富的缓存方案,如PrestoDB,不仅能够降低成本,还能实现事半功倍的效果。PrestoDB社区已成功应用于Meta公司和Uber等大型企业,其稳定性和性能表现得到了验证。
在内部实施过程中,我们通过使用PrestoDB缓存方案,实现了在不增加机器资源的前提下,将查询时间提速超过1倍,其他查询速度指标也有显著提升。详细效果将在后续文章中进行深入分析。
PrestoDB查询流程涉及数据缓存,通过将数据从外部服务拉取至内存和本地硬盘,减少对外部系统的依赖,以提升查询速度。为了确保缓存的有效性和容量管理,我们引入了元数据缓存功能,将Hive MetaStore的表、分区等信息缓存至内存中,通过刷新时间、过期时间和缓存实体上限控制数据的有效性和容量。
元数据缓存的实现基于Guava Cache,对于查询过程中的表信息缓存,我们实现了异步更新机制,保证了查询性能与数据有效性的平衡。对于分区信息缓存,我们也考虑了分区版本的检查,以确保数据的一致性。然而,在使用过程中,我们面临业务方自行缓存查询结果导致的缓存时间放大问题。为解决此问题,我们提供清理指定表分区缓存的HTTP接口,实现业务系统和PrestoDB的缓存同步。
在实践中,我们发现数据文件列表缓存可以显著提升对象存储的查询效率,但需确保表分区不会回溯重写数据。本地数据缓存通过Alluxio实现,需要针对社区版进行源码修改以兼容使用,并注意调度策略的优化以提高命中率和数据一致性。
通过一系列实践和优化,我们的系统在使用Alluxio本地缓存后,单机命中率可达%左右。利用Shadow Cache功能,我们可以评估业务场景是否适合使用缓存,并根据命中率调整缓存空间以获得最佳性能。
在调度策略上,我们采用SOFT_AFFINITY策略以保持数据处理的一致性,并设置一致性hash和阈值以减少节点上下线的影响和优先处理繁忙节点。未来,我们计划针对K8s容器化环境进行专门的调度优化,确保资源利用和任务分配的高效。
通过上述策略和技术实施,我们成功提升了系统性能,优化了用户体验,并在成本控制方面取得了显著成效。未来,我们将持续探索和实践,以实现更加高效和灵活的资源管理与性能优化。