首页 文章 精选 留言 我的

精选列表

搜索[全文搜索引擎],共6499篇文章
优秀的个人博客,低调大师

PCI Express 4.0规范全文下载,SSD和网卡何时能受益?

PCI Express® Base Specification Revision4.0 Version 1.0 下载链接 http://pan.baidu.com/s/1dFxqX9Z (也可以点击本文底部“阅读原文”) 大家可能看到新闻了,PCIe Express 4.0 v1.0规范终于正式发布,此时距离我撰写支持PCIe Gen4的《初探OpenPOWER9服务器设计:x86不再寂寞》已经过去一年的时间。不知这是否意味着POWER9将会尽快正式发布了呢? 有意思的是,在10年前PCIe 2.0发布的时候,我写过一篇工作站的评测,提到了对于显卡/GPU的意义,也就是全速x16插槽。 6年前,大约Intel发布第一代Xeon E5的半年之前,我也写过一篇评论,因为LSI已经提前推出了支持PCIe 3.0 x8的6Gb/s SAS控制器和HBA卡。 这次应该是9月底就完成的,整个规范共1293页 今天,在4.0草案标准期间“偷跑”的板卡同样不少,不过x16 lane宽度的显卡/GPU似乎不是当前最紧迫的,毕竟PCIe 3.0的8GT/s每个lane有效带宽接近1GB/s全双工。而对于SSD和网卡就不同了。 56/100Gb网卡、NVMe SSD渴望更大带宽 双端口56Gb InfiniBand HCA,用流行的PCIe 3.0 x8就存在瓶颈了;至于100Gb以太网等,如果不用PCIe x16单端口都发挥不出来,比如我在《4节点近160万IOPS:SDS/超融合测试不能只看数字》测试平台中使用的MellanoxConnentX-4网卡。 至于SSD,目前主流的NVMe用的是PCIe 3.0 x4,实际效率能跑到3.2GB/s就不错了,参见《Intel发布P4500、P4600 NVMeSSD:规格释疑》一文。除了少数高端企业级和发烧型号用x8接口之外,可以说单盘(卡)IOPS达到70-80万x4接口也开始出现瓶颈了。更何况未来会在存储阵列中应用的双端口U.2 SSD,x4 lane会拆分成2个x2来使用。 这样的M.2 SSD转接卡,是当前提高整体带宽的一种选择 如上图,4个M.2 PCIe x4直通转接PCIe x16,对于有些图形工作站等需要极高存储带宽的应用是一种解决方案。上面的卡我在《双Xeon SP只用一个风扇?Precision7920工作站散热设计解析》中曾经提到过,随着Dell新一代工作站机型发布,同样的Ultra-Speed Drive Duo/Quad也可以通过Intel RSTe vROC选项支持NVMe RAID0、1。 如果平台(主板)升级到PCIe 4.0,这种M.2转接方案的带宽理论上也可以翻倍,当然估计一时半会SSD还达不到那么快。 而PCIe 4.0的普及进程却不是太乐观,关于Intel发布不久的Xeon Scalable服务器/工作站平台我写过不少东西,这里随便列出一篇《IntelXeon SP服务器架构曝光:Apache Pass、QuickAssist》。据说Intel要等2019年发布的下一代Xeon平台才会支持PCIe 4.0,POWER由于指令集等方面原因难成主流,AMD又刚把PCIe控制器lane数量做上去(《超越Xeon?AMD Naples服务器的理想与现实》),估计短时间难以染指4.0。 GPU提升I/O的另一个路子——NVLink 除了CPU之外,GPU性能提升的速度似乎更快,不过NVIDIA自己搞出一套解决I/O互连的方式。 上面示意图是一款双CPU+ 4 GPU服务器,1U机箱支持4块300W GPU卡那种,我在《九条大道通GPU:HPC服务器PCIe之灵活应用》曾经介绍过它的PCIe直通和Switch有多种连接方式选择。 如今NVIDIA大力推广NVLINK,并且在一些应用中(比如GPU间显存频繁交换数据)性能提升明显,原有服务器机型也面临升级更新。上图所示Dell PowerEdge C4130就把GPU部分改造成一块NVLINK互连板,上面还是4个GPU模块,只在与CPU通信时才需要经过PCIe交换器,GPU间的带宽增大了。我还没仔细研究,估计是从PCIe卡换成下图这种SXM模块吧。 1U 4颗GPU、2U 8颗GPU是现在比较高的密度 具体来说最新的Tesla V100支持的NVLINK链路比P100还增加了2条(6 vs. 4),只是听说这东西有些贵:) Gen-Z、CAPI等能撼动PCIe吗? 两个月前我还写过一点相关的: 《Gen-Z互连(上):Intel缺席的内存中心架构》 《Gen-Z互连(下):第一步25-100GB/s、PCI-SIG的反应》 还是更欣赏TangJie总说过的一个观点:“这些新的I/O标准,如果想活下来,就必须大家联合起来。” 毕竟这么多年过去,PCIe生态太成熟了。先写到这里吧。

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

浅析Android 4.0的通知系统(附Android 4.0设计指南全文翻译)

通过手机的通知系统,可以将应用程序的一些重要消息告知给用户。流畅、舒适、友好的应用程序离不开精心设计的消息提醒机制。但是并不是所有的通知都是用户想看的,否则只会给用户造成骚扰,所以要谨慎使用通知。 在对《Android Design》进行翻译时发现:Android系统已经提出了一些关于通知消息的设计建议,故在此分享给大家。 一、何时使用通知? 通知主要用于对时间敏感(Time Sensitive)的事件,尤其是涉及他人(Involve another person)的同步事件。例如下面的Gtalk和日历发出的通知就是时间敏感,且与人相关的事件。 那么什么时候又不应该使用通知呢?官方的建议是: 不直接针对用户的,或不紧急的信息。例如SNS中与用户没有直接关系的新鲜事。Path可能就犯了这个错误。 正显示在当前屏幕的信息也不必创建一个通知。即正在聊天的时候,就不必再创建关于聊天消息的通知了。 系统可以自己完成而无需用户操作的简单动作,例如保存、同步或者是更新应用程序等。 如果发生错误了,但是应用程序可以快速自我恢复,此时也不必用通知去打断用户,甚至都可以不用让用户知道这个错误。 对于用户不能手动启动或停止的服务,也不必使用通知。 不要为了让用户对你的品牌记忆深刻而创建多余的通知,否则只会让用户反感。想让用户对你的应用程序保持注意力并且提供少量内容的最好方式是提供小部件(widget)给用户,让用户可以将它放到首页。 二、通知的设计指南 1. 使其私有化 其他用户发过来的通知应该在通知里包含用户的头像(Icon/Photo),还要显示通知的标题(Title)、消息内容(Message)、时间戳(Timestamp),以及应用程序的图标(Secondary Icon)。 2. 合并同类通知 如果一个应用程序发出了多个相同类型的通知,而且这些通知都还没被处理的话(被处理的通知会被移出通知抽屉),那么请将相同类型的通知合并为一个。 合并后的通知会有一个总结性的描述,并且能让用户知道一共合并了多少条通知(Number Pending)。 3. 对时间敏感事件的时间戳 默认的系统通知会在通知右上角打上时间戳,如果你认为显示时间戳对你的通知是没有意义的,那你可能就要重新考虑是否值得为这条消息创建一条通知了。如果这条通知确实足够重要,再决定是否不显示时间戳。 常见的需要显示时间戳的通知是通讯通知,如Email、短信、聊天消息这种,用户需要通过时间戳来理解消息的上下文。 4.通知相关的导航机制 如果用户点击了一条通知,此时应该将相关的应用程序打开到可以对通知中提到的内容进行操作的状态。但如果用户点击了一个合并的通知,应该去到列表页面(内容页的上一层级),后面第三部分会详细阐述。 5.自我清理 有些通知会在某个时间点出现告知用户一些相关的信息和提示,但是如果过了那个时间点,这个通知可能对用户来说就不重要了,此时就应该考虑自动删除这条通知。 同样的,用户查看过的聊天消息或邮件,也应该让用户不必手动操作就移除这些通知。 6.为通知提供预览 提供一段简短的文本作为通知的预览可以让用户大致了解通知的内容,从而帮助用户决定是否立刻查看该通知。 7.让用户决定是否显示通知 用户可能对频繁出现的通知感到厌烦,所以应该让用户决定是否显示通知。因此,在应用程序的设置中应该让用户可以取消通知。 8.使用不同的图标 为了让用户在通知栏看一眼就能知道是哪个应用程序发出的通知,应该采用有自己特色的图标。所以在设计应用程序的图标的时候,应该注意与其他Android应用的通知图标有比较明显的区别。 但需要注意的是不要用颜色来区分,因为通知图标通常都是黑白的。 三、通知的导航机制 1.单条通知与合并通知 如果用户点击了一条通知,此时应该将相关的应用程序打开到可以对通知中提到的内容进行操作的状态。例如用户收到一封新邮件的通知,用户点开该通知后应该去到这封邮件的内容页。因为同类通知会被合并,如果用户点击了一个合并的通知,应该去到列表页面(内容页的上一层级)。在下面的例子中,用户点开一条合并的新邮件通知后,进入了收件箱界面. 2.间接通知 如果应用程序需要同时展示多个事件的信息,可以使用一条通知将用户指引到一个中间界面。这个界面会展示这些事件,并为用户提供进入应用程序的入口。这种类型的通知被称为间接通知。 例如一个用户在Gmail中收到了Calendar发出的一条间接通知。点击这条通知后打开一个中间界面(calendar interstitial),这个界面下显示了几个事件的提醒,在这个界面点“返回”键会回到Gmail,但是如果用户点击了某个事件提醒,就会离开这个中间界面并打开Calendar应用程序以显示这个事件的详细内容。在这个事件的详细内容的界面下,点“向上”和“返回”都会去到Calendar应用的首页。在间接通知的中间界面点“返回”会回到触发该通知的界面,返回路径中不会被插入其他界面。一旦用户通过中间界面进入了应用程序,“向上”和“返回”的逻辑就与标准通知一样了:在应用程序之间进行导航,而不会返回到中间界面。 关于间接通知的详细内容请查看百度MUX翻译的《Android Design》的模式Patterns—-导航Navigation章节。 3. 弹出通知 弹出通知会绕过抽屉通知直接出现在用户面前。一般情况下很少使用,只在需要及时地反馈并且必须打断用户的场合下才会使用。例如Talk应用使用这种形式的通知来提醒用户有好友邀请他加入视频聊天,因为这个邀请会在几秒后自动失效。 对于导航行为,弹出通知严格遵循间接通知的中间界面的导航逻辑。点“返回”会关闭弹出通知。如果用户从这条弹出通知进入了发出通知的应用程序,“向上”和“返回”的逻辑会与标准通知的逻辑保持一致,在应用程序内进行导航。 关于间接通知的详细内容请查看百度MUX翻译的《Android Design》的模式Patterns—-导航Navigation章节。 四、通知的相关交互 1. 通知抽屉 默认情况下,待处理的通知是以图标形式显示在状态栏中,从屏幕上方向下滑即可打开通知抽屉。 最近的通知排在最前面,点击一条通知会将其应用程序打开到与这条通知相关的界面。 在一条通知上向左或向右横划即可移除该通知。 在Android 4.0的平板电脑中,通知栏则被集成到底部的系统栏里,在通知区域的任意位置点击即可打开通知抽屉。 2. 进行中的通知 有一些通知是让用户了解后台正在运行的进程。例如正在播放的音乐播放器、正在后台运行的省电程序、正在保护系统的安全软件等。另外也可以对下载上传、视频编码这种持续时间较长的任务提供反馈。这种进行中的通知是不可以被移除的。 3.Dialog和Toast用作反馈 如果某个应用程序没有在当前屏幕运行,它就不应该弹出对话框(Dialog)和提示条(Toast)。对话框和提示条应该是用户在当前应用程序下执行操作时,用来提供即时的操作反馈的。比如对话框可以让用户知道某个操作的危险后果,而提示条可以让用户知道某个操作已成功执行。 五、总结 在Android平台设计应用程序的通知消息时应该明确在哪些场景下使用通知;不同的场景显示什么类型的通知。在设计的时候还要注意通知的私有化、导航逻辑、清理机制、同类通知的合并、图标的设计等。为避免对用户造成骚扰,还应该在应用程序的设置中增加对是否显示通知消息的设置。 从较早版本的Android系统开始,就具备了比较成熟的通知系统,新版iOS系统也参考了类似的设计。所以充分利用Android的通知系统,一定可以让用户对你的应用程序了如指掌。 另附上MUX翻译的最新版《Android Design》,欢迎大家下载阅读。 译文:http://mux.baidu.com/img/97/AndroidDesign-BaiduMUX.pdf 原文:http://developer.android.com/design/ 【本文首发于: 百度无线用户体验官方博客】 http://mux.baidu.com/?p=3183 【 关注百度技术沙龙】 本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/908498,如需转载请自行联系原作者

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

向量搜索引擎 Milvus 发布新版本 0.7.0

版本兼容 新增功能 向量删除 新增了对单条或多条向量的删除功能。如果您对一个集合进行了向量删除操作,后续对这个集合的搜索操作仅支持一部分索引类型,包括在CPU上运行的 Flat、IVFlat、IVFSQ8 等。Milvus 的后续版本将为其他索引类型提供支持。#86 向量读取 新增了通过向量 ID 读取对应的向量值的功能。#861 数据落盘与压缩 新增了数据落盘与压缩功能。您可以设置定时落盘或者手动落盘,从而避免数据丢失。如果一个段中的向量数据被删除,被删除的向量数据占据的空间并不会自动释放。您可以对集合中的段进行压缩操作以释放多余空间。#861#1426 运行时更改 Milvus 服务端参数 新增了运行时更改 Milvus 服务端参数的功能。您可以通过 Milvus 客户端对 Milvus 服务端参数进行更改,部分参数更改后可即时生效,无需重启 Milvus。#665 预写式日志(Write-Ahead Logging, WAL) 新增了 WAL 功能,可以大大提高数据操作的可靠性。您可以在 Milvus 服务端配置文件(server_config.yaml)中对 WAL 进行设置。#830 RESTful API 新增了 RESTful API。详细信息请参考RESTful API Readme。 Go SDK 新增了 Go SDK,详细信息请参考https://github.com/milvus-io/milvus-sdk-go。 HNSW 索引的支持 新增了对 HNSW 索引类型的支持。关于 HNSW 的详细介绍请参考向量索引算法 HNSW 和 NSG 的比较。#853 Jaccard/Hamming/Tanimoto 距离的支持 新增了对 Jaccard、Hamming、Tanimoto 距离的支持。#823 Prometheus 中 Pushgateway 的支持 新增了在 Prometheus 中 Pushgateway 的支持。Pushgateway 使生命周期短、批量的 metric 能够被 Prometheus 提取。#813 AVX 512 指令集的支持 新增了对 AVX 512 指令集的支持。Milvus 理论上可支持所有包含 AVX 512 指令集的 CPU。#1122 变更说明 创建索引与搜索的接口更新 从 Milvus 0.7.0开始,所有客户端创建索引与搜索的接口中的部分参数使用 JSON 字符串进行传值。 Milvus 服务端配置文件更新 从 Milvus 0.7.0开始,Milvus 服务端配置文件(server_config.yaml)版本更新为0.2。配置文件的参数也发生了变化。 术语更新 从0.7.0开始,Milvus 的 Table(表) 正式改名为 Collection(集合)。 Bug 修复 解决了插入向量时使用自动生成的ID 时可能产生重复ID的问题。#1508 对新版本有问题吗?下周二(3.17.2020)晚上八点的线上问答将进行 v.0.7.0 相关专题, 有任何问题或是建议都可以来与我们聊聊!

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

Elastic Search搜索引擎在SpringBoot中的实践

实验环境 ES版本:5.3.0 spring bt版本:1.5.9 首先当然需要安装好elastic search环境,最好再安装上可视化插件 elasticsearch-head来便于我们直观地查看数据。 当然这部分可以参考本人的帖子:《centos7上elastic search安装填坑记》https://www.jianshu.com/p/04f4d7b4a1d3 我的ES安装在http://113.209.119.170:9200/这个地址(该地址需要配到springboot项目中去) Spring工程创建 这部分没有特殊要交代的,但有几个注意点一定要当心 注意在新建项目时记得勾选web和NoSQL中的Elasticsearch依赖,来张图说明一下吧: 项目自动生成以后pom.xml中会自动添加spring-boot-starter-data-elasticsearch的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 本项目中我们使用开源的基于restful的es java客户端jest,所以还需要在pom.xml中添加jest依赖: <dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> </dependency> 除此之外还必须添加jna的依赖: <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> </dependency> 否则启动spring项目的时候会报JNA not found. native methods will be disabled.的错误: 项目的配置文件application.yml中需要把es服务器地址配置对 server: port: 6325 spring: elasticsearch: jest: uris: - http://113.209.119.170:9200 # ES服务器的地址! read-timeout: 5000 代码组织 我的项目代码组织如下: 各部分代码详解如下,注释都有: Entity.java package com.hansonwang99.springboot_es_demo.entity; import java.io.Serializable; import org.springframework.data.elasticsearch.annotations.Document; public class Entity implements Serializable{ private static final long serialVersionUID = -763638353551774166L; public static final String INDEX_NAME = "index_entity"; public static final String TYPE = "tstype"; private Long id; private String name; public Entity() { super(); } public Entity(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } TestService.java package com.hansonwang99.springboot_es_demo.service; import com.hansonwang99.springboot_es_demo.entity.Entity; import java.util.List; public interface TestService { void saveEntity(Entity entity); void saveEntity(List<Entity> entityList); List<Entity> searchEntity(String searchContent); } TestServiceImpl.java package com.hansonwang99.springboot_es_demo.service.impl; import java.io.IOException; import java.util.List; import com.hansonwang99.springboot_es_demo.entity.Entity; import com.hansonwang99.springboot_es_demo.service.TestService; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import io.searchbox.client.JestClient; import io.searchbox.client.JestResult; import io.searchbox.core.Bulk; import io.searchbox.core.Index; import io.searchbox.core.Search; @Service public class TestServiceImpl implements TestService { private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class); @Autowired private JestClient jestClient; @Override public void saveEntity(Entity entity) { Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build(); try { jestClient.execute(index); LOGGER.info("ES 插入完成"); } catch (IOException e) { e.printStackTrace(); LOGGER.error(e.getMessage()); } } /** * 批量保存内容到ES */ @Override public void saveEntity(List<Entity> entityList) { Bulk.Builder bulk = new Bulk.Builder(); for(Entity entity : entityList) { Index index = new Index.Builder(entity).index(Entity.INDEX_NAME).type(Entity.TYPE).build(); bulk.addAction(index); } try { jestClient.execute(bulk.build()); LOGGER.info("ES 插入完成"); } catch (IOException e) { e.printStackTrace(); LOGGER.error(e.getMessage()); } } /** * 在ES中搜索内容 */ @Override public List<Entity> searchEntity(String searchContent){ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //searchSourceBuilder.query(QueryBuilders.queryStringQuery(searchContent)); //searchSourceBuilder.field("name"); searchSourceBuilder.query(QueryBuilders.matchQuery("name",searchContent)); Search search = new Search.Builder(searchSourceBuilder.toString()) .addIndex(Entity.INDEX_NAME).addType(Entity.TYPE).build(); try { JestResult result = jestClient.execute(search); return result.getSourceAsObjectList(Entity.class); } catch (IOException e) { LOGGER.error(e.getMessage()); e.printStackTrace(); } return null; } } EntityController.java package com.hansonwang99.springboot_es_demo.controller; import java.util.ArrayList; import java.util.List; import com.hansonwang99.springboot_es_demo.entity.Entity; import com.hansonwang99.springboot_es_demo.service.TestService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/entityController") public class EntityController { @Autowired TestService cityESService; @RequestMapping(value="/save", method=RequestMethod.GET) public String save(long id, String name) { System.out.println("save 接口"); if(id>0 && StringUtils.isNotEmpty(name)) { Entity newEntity = new Entity(id,name); List<Entity> addList = new ArrayList<Entity>(); addList.add(newEntity); cityESService.saveEntity(addList); return "OK"; }else { return "Bad input value"; } } @RequestMapping(value="/search", method=RequestMethod.GET) public List<Entity> save(String name) { List<Entity> entityList = null; if(StringUtils.isNotEmpty(name)) { entityList = cityESService.searchEntity(name); } return entityList; } } 实际实验 增加几条数据,可以使用postman工具,也可以直接在浏览器中输入,如增加以下5条数据: http://localhost:6325/entityController/save?id=1&name=南京中山陵 http://localhost:6325/entityController/save?id=2&name=中国南京师范大学 http://localhost:6325/entityController/save?id=3&name=南京夫子庙 http://localhost:6325/entityController/save?id=4&name=杭州也非常不错 http://localhost:6325/entityController/save?id=5&name=中国南边好像没有叫带京字的城市了 数据插入效果如下(使用可视化插件elasticsearch-head观看): 我们来做一下搜索的测试:例如我要搜索关键字“南京”我们在浏览器中输入: http://localhost:6325/entityController/search?name=南京 搜索结果如下: 刚才插入的5条记录中包含关键字“南京”的四条记录均被搜索出来了! 当然这里用的是standard分词方式,将每个中文都作为了一个term,凡是包含“南”、“京”关键字的记录都被搜索了出来,只是评分不同而已,当然还有其他的一些分词方式,此时需要其他分词插件的支持,此处暂不涉及,后文中再做探索。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册