基于thanos搭建分布式prometheus
prometheus切过去就可以了,这比配置sidecar的方式感受起来要好很多,也是腾讯TKE团队选择的大规模集群方案。 我发布了2个YAML,不需要任何改动,直接生效到集群中可以马上体验到效果:https://github.com/owenliang/thanos-prometheus 先部署thanos receive存储集群: YAML...阅读全文
prometheus切过去就可以了,这比配置sidecar的方式感受起来要好很多,也是腾讯TKE团队选择的大规模集群方案。 我发布了2个YAML,不需要任何改动,直接生效到集群中可以马上体验到效果:https://github.com/owenliang/thanos-prometheus 先部署thanos receive存储集群: YAML...阅读全文
工作。但是,正如我们所建议的,它所需要的工作量取决于你对项目成功的定义。总而言之,开放源码开发的核心原则:透明度,开放性和英才制度。其他一切都由此衍生。...阅读全文
job名称和当前分支名称或者是tag作为存档名称,只存档没有被Git跟踪的文件: job: artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" untracked: true 使用当前stage和分支名称作为存档名称: job: artifacts: name: "${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}" untracked: true 如果是使用Windows批处理来运行yaml脚本,需要用%替换$: job: artifacts: name: "%CI_JOB_STAGE%_%CI_COMMIT_REF_NAME%" untracked: true artifacts:when GitLab...阅读全文
大的提高一条连接上面的 stream 并发,可以考虑调大 SETTINGS_MAX_CONCURRENT_STREAMS,在 TiKV 里面,我们就遇到过这个值比较小,整体吞吐上不去的问题。 这里还需要注意,虽然一条连接上面能够处理更多的请求了,但一条连接远远是不够的。一条连接通常只有一个线程来处理,所以并不能充分利用服务器多核的优势。同时,每个请求编解码还是有开销的,所以用一条连接还是会出现瓶颈。 在 TiKV 有一个版本中,我们就过分相信一条连接跑多 streams 这种方式没有问题,就让 client 只用一条连接跟 TiKV 交互,结果发现性能完全没法用,不光处理连接的线程 CPU 跑满,整体的性能也上不去,后来我们换成了多条连接,情况才好转。 Priority 因为一条连接允许多个...阅读全文
管理、流量分割和版本管理。然而,这个选项并没有提供自动扩展功能。 - **Seldon Core** 是一款第三方工具,可用于 Kubeflow 抽象和资源。它支持多种机器学习框架,包括 TensorFlow,并允许将训练好的 TensorFlow 模型转换为 REST/gRPC 微服务,运行在 Kubernetes 中。Seldon Core 默认支持模型自动扩展。 - **BentoML** 是 Kubeflow 使用的另一个第三方工具,它提供高级的模型服务功能,包括自动扩展,以及支持微批处理的高性能 API 模型服务器。 在下一节中,我将展示如何使用 KFServing 对训练好的 TensorFlow 模型进行自动扩展,KFServing 是默认的 Kubeflow 安装中的一个模块...阅读全文
返回一个空的记录集 。 Lookup 而没有索引支持 Lookup 的功能和 SQL 联合查询类似。为了获得良好的性能,作为外键的键值上需要有索引。这并不明显,因为其使用并没有在 explain() 中报告。这些索引并不包含在 explain() 记录的索引里,那些索引是供管道操作符$match、$sort 出现在管道开始时使用的。现在,索引可以覆盖聚合管道的任何阶段 。 不使用多条更新 db.collection.update() 方法用于修改一个已存在文档的一部分或全部,或者是整个替换一个已存在的文档,这取决于你提供的 更新参数 。除非你设置 multi 参数,更新匹配查询条件的所有文档,否则它不会更新集合里的所有文档。这一点不是那么明显。 忘记哈希对象中键序的意义 在 JSON 中,一...阅读全文
处理部分流量同时又不修改服务器的地址成为可能。 性能 HAProxy借助于OS上几种常见的技术来实现性能的最大化。 1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。 2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。 3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽; 4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting); 5,内存...阅读全文
基本特性写出好的代码,那你换成另外一种语言也无济于事。你会写出一样差的代码。我经常看到有些人 Java 代码写得相当乱,相当糟糕,却骂 Java 不好,雄心勃勃要换用 Go 语言。这些人没有明白,是否能写出好的代码在于人,而不在于语言。如果你的心中没有清晰简单的思维模型,你用任何语言表述出来都是一堆乱麻。如果你 Java 代码写得很糟糕,那么你写 Go 语言代码也会一样糟糕,甚至更差。 很多初学者不了解,一个高明的程序员如果开始用一种新的程序语言,他往往不是去看这个语言的大部头手册或者书籍,而是先有一个需要解决的问题。手头有了问题,他可以用两分钟浏览一下这语言的手册,看看这语言大概长什么样。然后,他直接拿起一段例子代码来开始修改捣鼓,想法把这代码改成自己正想解决的问题。在这个简短的过程中,他...阅读全文
口。 如果你希望其它操作系统的软件也可以连接到 Privoxy 的监听端口,可以修改绑定的地址,把 127.0.0.1 改为 0.0.0.0 表示绑定在“任意地址”。 操作步骤如下: 找到“主配置文件”,用你比较顺手的文本编辑器打开,在尾部增加如下一行 listen-address 0.0.0.0:8118 如果你不喜欢 8118 这个端口号,也可以换成别的。 修改完之后,启动 Privoxy,然后在命令行使用 netstat 命令,就可以看到多出来一个 8118 的端口(关于 netstat 的使用,可以参见《多台电脑如何共享翻墙通道》)。 ◇如何定制“HTTP 代理转发” 刚才那个只是热身,下面来一个稍微复杂点的——“链式代理/代理转发”。 关于“链式代理/代理转发”的概念,本文开头部分...阅读全文
开源的 Pinpoint,近几年 Uber 公司开源的 Jaeger,以及我们国内吴晟开源的 SkyWalking。 有人说,这些其实都归功于 Google 在 2010 年基于其内部大规模分布式链路追踪系统 Dapper 实践而发表的论文,它的设计理念是一切分布式调用链追踪系统的始祖,但其实早在二十年前(2002年),当年世界上最大的电商平台 eBay 就已拥有了调用链追踪系统 CAL(Centralized Application Logging)。2011 年,原eBay的中国研发中心的资深架构师吴其敏跳槽至大众点评,并且深入吸收消化了 CAL 的设计思想,主导研发并开源了CAT(Centralized Application Tracking)。 CAT 作为国人主导的开源系统,其本...阅读全文
实验。尽管 Pis 已经是比较旧的树莓派型号,但最近 Astro Pi 项目组刚刚对它们进行了内存升级,把 32 GB SD 卡换成了 256 GB 的 microSD 卡。7.树莓派基金会希望老款的产品也能永远存在尽管 Raspberry Pi B +,Raspberry Pi 2,Raspberry Pi 3 B 和其他一些老款型号的树莓派产品已经发布了很多年,但树莓派基金会仍在继续积极地制造并销售它们。树莓派官方表示不会报废(EOL)产品,因为树莓派低成本的特性,这些老款的树莓派在很多对设备性能要求并不高的工业客户中依然很受欢迎。 树莓派创始人 Upton 在 2019 年接受媒体采访时曾表示:“停产意味着产品的死亡,我们迄今为止仅停产了 5 种产品。”他说,树莓派目前停产的仅有 5...阅读全文
Thrift 缺失的能力。 Thriftgo 目前虽然仅支持生成 Golang Thrift 代码,但其定位是可支持各语言的 Thrift 代码生成,未来如果有需求,我们会考虑生成其他语言的代码。同时我们也会尝试将其回馈至 Apache Thrift 社区。 Netpoll-http2 Netpoll-http2 基于 Golang 标准库 golang.org/x/net/http2 的源码替换 go net 为 Netpoll,目前用于 Kitex 对 gRPC 协议的支持,对 HTTP2 有需求的外部开发者也可以使用此库。 前面提到字节跳动会坚持内外维护一套代码,为了遵守长期投入承诺,其基础架构团队已经将与内部生态没有耦合的项目,如 Netpoll,直接迁移到 CloudWeGo 开源库,并将内...阅读全文
一些发行版中我们也能看到它的身影。 Apt是一个很完整和先进的软件包管理程序,使用它可以让你又简单,又准确的找到你要的的软件包, 并且安装或卸载都很简洁。 它还可以让你的所有软件都更新到最新状态,而且也可以用来对 Debian/Ubuntu 进行升级。apt是需要用命令来操作的软件,不过现在也出现了很多有图形的软件,比如 Synaptic, Kynaptic 和 Adept。 命令样例 下面将要介绍的命令大部分需要sudo,使用时请将“packagename”和“string”替换成您想要安装或者查找的程序。 apt-get update —— 在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件...阅读全文
Bug、回应用户请求),来使你的 sponsor 相信你已经有能力来处理好某个特定软件包,这样他们才会在接下来的申请流程中推荐你。 一些 sponsor 会在他们觉得合适时向你提议申请 DM,另外一些不会,作为新维护人员要在自己觉得差不多合适的情况下和 sponsor 进行沟通,听取他的意见看是否可以申请。 6. 申请 DM 前要让至少一位你 sponsor 之外的 DD 对你的 GPG 密钥进行数字签名,且密钥本身至少要 2048 RSA 或更强。签署密钥不需要对技能的考察,其目的是确认每个密钥的控制者确实是他本人,从而构建 Web of Trust,因而任何人都可以参与到密钥签名活动当中。签名时一般需要双方在现实生活中见面,互相检查身份证或护照确认无误后,交换事先打印好的 GPG key...阅读全文
SSD来调整其默认配置。一般不需要手动调整。 原型mclock QoS排队算法已经可用。 新增一种退出机制,可以防止OSD出现对当前不能处理IO对象或PG的请求过载情况。 OSD更换过程简化,变得更加强大了。 您可以使用ceph功能来查询所有连接的后台程序和客户端的支持功能和版本。 通过ceph osd set-require-min-compat-client连接到集群,您可以配置最旧的Ceph客户端版本,但 Ceph将阻止您启用会破坏与这些客户端的兼容性的功能。 包括osd_recovery_sleep,osd_snap_trim_sleep和osd_scrub_sleep的几个睡眠设置,已经被重新实现,并且可以有效地工作。(这些在某些情况下用于解决问题,限制后台工作。) 完成对...阅读全文
程中的演示只是运行在实验室环境中。测试DNS服务器所有必要的记录都已配置,并且用户之间的邮件可以在相同的服务器上发送(相同的域交换)。为了让事情更有趣,多邮件服务器可以被部署到不同的域来检查电子邮件如何跨域通信,因为必要的DNS记录都已存在。 对外的邮件服务器有效的DNS记录。 Postfix和Dovecot的的设置,可以根据需要进行调整。 警告:如果想要部署邮件服务器任何能够访问互联网邮件服务器,请确保您的SMTP是安全的。互联网以及来自局域网内部的恶意软件都是可以攻击SMTP的。...阅读全文
让我们先探讨什么是基于主机的入侵检测系统。如前所述,入侵检测系统是一种硬件或软件应用程序,可在检测到恶意活动时检测并警告管理员。HIDS主要专注于监视和分析日志文件,以便 基于预定义的策略和一组规则来检测异常和未经授权的更改。换句话说,HIDS与您添加的预先建立的规则一样有效。对于大量存储的日志,提取有意义的信息对于检测异常至关重要。提取的信息应准确。因此,确保这些日志的安全性对于防御日志操纵至关重要。1. OSSECOSSEC是开源安全事件关联器的缩写。这个建立良好且信誉良好的解决方案是OSSEC基金会开发和维护的免费和开放源代码的基于主机的入侵检测系统,这要归功于众多的贡献者。它后来归趋势科技所有。这是一个不断发展的项目,每月下载约5000次,并且具有可扩展性和多平台方面的特点,因为它...阅读全文
资源,从而获取虚拟货币的一种程序,需要较高的硬件配置及用电量。 而单凭一个矿工的力量是挖不到比特币的。于是“安某”便想到可以利用自己的职务之便利用百度的服务器来开启自己的发家致富之路,只是他可能没想到的是事情会败露的这么快。 那么,他具体是怎么做的呢? 首先,他用自己的工作账户上传了一个压缩文件 miner.tar.gz ,其中包含一个名为 java_4u3 的脚本, 而这个脚本可以自动执行解压缩、创建目录、删除目录、自动连接代理进行网络交换,达到控制服务器的目的。 然后,编译了一个挖矿程序,并将上述程序部署非法控制了百度的 155 台服务器上,利用公司为其配备的苹果电脑上的 iterm 软件控制所有服务器的中控机,通过中控机上传挖矿脚本,并通过 iterm 软件发出批量下载指令,让 200...阅读全文
之。由于第二个Sandbox容器依然在运行,因此HouseKeeping会将其清理,其中的一个步骤是清理该Pod所属的cgroup,杀死该group中的所有进程,这样第二个Sandbox容器里的pause进程被杀,容器退出。 已经死亡的第二个Sandbox容器会被kubelet里的垃圾回收循环接管,它将被彻底停止销毁。然而由于之前的Housekeeping操作已经销毁了该容器的cgroup, 网络名称空间不复存在,因此在调用CNI插件拆除Sandbox网络时,kubelet无法获得正确的NETNS参数传给CNI,只能传入空字符串。 到此,问题的原因已经确认。 问题解决 一切水落石出后,我们开始着手解决问题。为了能确保找到所删除的Pod对应的VPC IP,CNI需要在ADD操作成功后,将...阅读全文
开源社区是个独特的存在。它虽然结构松散但却又切实有效,为社会提供便利好用的产品却不以利益为目的,将志趣相同的人们聚集在一起但又完整地保存了每一个个体的独特性...... 这些开源社区就像是一场场风格迥异的社会实验。 其中,Debian 社区是一个典型代表。作为 Linux 最早的发行版本之一,诞生于1993年的 Debian 可以算是开源社区中的“活化石”。这也令 Debian 在机制、行事和文化等方面都体现出了一定的“古典”特质。 最近,Debian 社区正在酝酿一件大事 —— 改革自己的决策机制。一直以来,Debian 的决策机制都饱受诟病,不少优秀的开发者因此离开,这样的变革或许不可避免。 01 离开 “长久以来,Debian 都难以作出改变。” 2014年的时候,Joey Hess...阅读全文
索运行Nginx的端口。 Kubernetes将自动分配一个大于30000的随机端口,同时确保该端口尚未受到其他服务的约束。 要测试一切是否正常,请通过本地计算机上的浏览器访问http:// worker_1_ip : nginx_port或http://worker_2_ip : nginx_port 。 您将看到Nginx熟悉的欢迎页面。 如果要删除Nginx应用程序,请先从主节点删除nginx服务: kubectl delete service nginx 运行以下命令以确保已删除该服务: kubectl get services 您将看到以下输出: OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes...阅读全文
,时间复杂度O(1) GET:获取某个key对应的value,时间复杂度O(1) GETSET:为一个key设置value,并返回该key的原value,时间复杂度O(1) MSET:为多个key设置value,时间复杂度O(N) MSETNX:同MSET,如果指定的key中有任意一个已存在,则不进行任何操作,时间复杂度O(N) MGET:获取多个key对应的value,时间复杂度O(N) 上文提到过,Redis的基本数据类型只有String,但Redis可以把String作为整型或浮点型数字来使用,主要体现在INCR、DECR类的命令上: INCR:将key对应的value值自增1,并返回自增后的值。只对可以转换为整型的String数据起作用。时间复杂度O(1) INCRBY:将key对应的...阅读全文
详细徐叙述 2、设置数组边界值,一维数组就是设置第一个数字,二维数组就是设置第一行跟第一列的值,特别的滚动一维数组是要设置整个数组的值,然后根据后面不同的数据加进来变幻成不同的值。 3、找出状态转换方程,也就是说找到每个状态跟他上一个状态的关系,根据状态转化方程写出代码。 4、返回需要的值,一般是数组的最后一个或者二维数组的最右下角。 代码基本框架: for(j=1; j<=m; j=j+1) // 第一个阶段 xn[j] = 初始值; for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段 for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式 xi[j]=j=max(或min){g(xi-[j1:j2]), ......, g(xi-1[jk:jk+1...阅读全文
(establishment)在欧盟境内,不论该数据处理的行为发生在境内或境外,该数据控制者或处理者及其欧盟境内的营业场所都将受到GDPR的约束——前提是该数据控制者或处理者与欧盟境内的营业场所之间存在“不可摆脱的联系”(inextricable link)。依据第29工作组(WP 29)的观点和欧盟法院判例,“财务上的联系、提供免费网络服务以换取用户会员费或用户订阅、利用用户数据盈利”,都可被认定存在‘不可摆脱的联系’。”[5] (3) 保护性管辖:无论数据控制者和处理者是否在欧盟境内有实体机构,也不论数据处理行为是否发生在欧盟境内,只要向欧盟数据主体提供产品或服务(无论该产品或服务是否需要支付对价)[6]或监控其行为[7],或只要处理或持有居住在欧盟的数据主体的数据的所有企业,都受GDPR的管辖。 (4) 根据国...阅读全文
时间来看,整个任务初始化,调度以及部署的阶段,大概能够减少分钟级的时间消耗。 2. 细粒度资源管理 细粒度资源管理在过去很多的版本都一直在做,在 Flink1.14 终于可以把这一部分 API 开放出来在 DataSteam 提供给用户使用了。用户可以在 DataStream 中自定义 SlotSharingGroup 的划分情况,如下图所示的方式去定义 Slot 的资源划分,实现了支持 DataStream API,自定义 SSG 划分方式以及资源配置 TaskManager 动态资源扣减。 对于每一个 Slot 可以通过比较细粒度的配置,我们在 Runtime 上会自动根据用户资源配置进行动态的资源切割。 这样做的好处是不会像之前那样有固定资源的 Slot,而是做资源的动态扣减,通过这样...阅读全文
: 'ruochen', tags: ['mongodb', 'databases', 'NoSQL'] }) db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}) # 只会修改第一条发现的文档 db.ruochen.find().pretty() db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}, {multi:true}) # 修改多条相同的文档 save() 方法: 通过传入的文档来替换已有文档 格式 db.collection.save(
。2024财年;国防部创建了零信任参考架构;美国国家安全局发布了一份Kubernetes 强化指南,专门描述了 Kubernetes 中零信任安全的最佳实践。随着这种噪音,零信任无疑吸引了很多营销关注。但尽管有噪音,零信任不仅仅是一个空洞的术语——它代表了对未来安全的一些深刻和变革性的想法。那么具体来说,什么是零信任,为什么它突然变得如此重要?零信任对 Kubernetes 用户意味着什么?什么是零信任?正如所料,零信任从根本上讲是关于信任。它是解决安全核心问题之一的模型:是否允许 X 访问 Y?换句话说,我们是否相信 X 可以访问 Y?当然,零信任中的“零”有点夸张。要使软件正常工作,显然某些东西需要信任其他东西。因此,零信任并不是完全消除信任,而是将信任降低到最低限度(众所周知的最小特权原则)并...阅读全文
有更好的吞吐量,内置的分区,冗余及容错性,这让Kafka成为了一个很好的大规模消息处理应用的解决方案。消息系统 一般吞吐量相对较低,但是需要更小的端到端延时,并尝尝依赖于Kafka提供的强大的持久性保障。在这个领域,Kafka足以媲美传统消息系统,如ActiveMR或RabbitMQ 站点的用户活动追踪: 为了更好地理解用户行为,改善用户体验,将用户查看了哪个页面、点击了哪些内容等信息发送到每个数据中心的Kafka集群上,并通过Hadoop进行分析、生成日常报告。 流处理:保存收集流数据,以提供之后对接的Storm或其他流式计算框架进行处理。很多用户会将那些从原始topic来的数据进行 阶段性处理,汇总,扩充或者以其他的方式转换到新的topic下再继续后面的处理。例如一个文章推荐的处理流程...阅读全文
增强和安全修复,主要针对的场景是数据中心大规模 Java 应用部署情况下,Java 应用稳定性、效率以及性能的优化与提高。从目前公开的功能和披露的规划上来看,Dragonwell 8 具有下述三大重要特性: JwarmUp JwarmUp 是为了解决双十一抢购场景下,阿里巴巴 Java 系统 warmup 的痛点。以普通的 Java 应用举例,JVM 需要经过解释执行 (interpreter) 找到热点,然后通过 JIT 编译器来加速热点方法的运行。对于高并发场景,应用启动之后会有很长时间处于寻找热点、编译热点的状态。这时,很多性能指标 (CPU 使用率、TPS 吞吐量、 RT 响应时间) 不是非常理想。换句话说,当 Java 应用启动并提供服务之后,在相当长的时间内处于 warmup 状...阅读全文
”:无效的 cgroup,不能启用 controller,不能加入进程。可以转换为 threaded 类型的 cgroup。 “threaded”:threaded 类型 cgroup,位于 threaded 子树中。 ❯ cat cgroup.type domain cpu.pressure 当前 cgroup 的 CPU 压力情况,基于 PSI[6](Pressure Stall Information)实现,这是 kernel 引入的一种评估系统压力的机制。内容如下: ❯ cat cpu.pressure some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0...阅读全文
0.269t 0.053t 0.025t D 14.6 86.2 1081:18 influxd在出现堆积时,wa很高,说明问题再次出现在磁盘io上,而且influxd的SHR空间占用了25g,又是为什么?面对新出现的问题,当前的主要手段仍然是从influxdb配置文件入手,但是该如何优化?2.tsi原理工欲善其事,必先利其器。查阅了相关资料之后,整理了influxdb使用tsi索引时原理图:说明:写入influxdb时,会同时写wal文件及cache内存, wal用于宕机恢复cachecache在达到配置中的阈值时,会进行snapshot快照,进行落盘influxdb的series及index索引会在内存中全量保存,用于快速检索wal文件大小在达到配置中阈值时,会进行压缩转换到index索引...阅读全文
些代表有权力在考虑技术标准和共识的情况下做出他们认为最佳的决定。 至于 Debian 社区的项目层面,DPL 更是无权过问,每个项目的开发者都对项目有百分百的决定权。比如,个别开发者几乎可以完全控制他们维护的软件包;开发人员之间的技术分歧很大的时候,将由项目技术委员会处理;发布管理者与 FTP 主人有权最终决定项目实际发布的内容,以及何时发布;项目秘书负责确保遵循必要的程序;政策团队处理项目的大部分总体设计。 其次,DPL 是可以随时进行更换的,因为有一般决议(General Resolution)这样的通道,开发者们可以重新选举另外的 DPL、撤销 DPL 或代表的决定、修改基本文件并做出其他有约束力的决定。(如下图所示) 那么,DPL 到底是干什么的呢?主要分为两个方面: 在对外职能中...阅读全文
且也是显而易见的。 这同样也适用于个人。如果你所从事的工作具有可替代性,那么你最终就会被薪资要求更低的人所取代。 增强竞争力的最佳方式就是建立话语权。例如,你可以利用好个人关系,打造强大的个人品牌,或是在不同领域的交叉点建立起自己的个人优势。当然增强竞争力的方式还有很多,但不论采取什么方式,关键是你必须要做到这一点。 大多数人会模仿身边人的做法,但这种方式并不可取,如果一味模仿他人,那你还有什么竞争优势可言呢? 11 建立人际网络 出色的工作需要团队合作。打造既可密切合作又可轻松相处的优质人际网络是事业成功的必要因素。拥有优秀人才的人际网络的规模会决定你能成功的上限。 建立人际网络的有效方法之一是尽可能多帮助他人。长期以来,这种行为方式给我带来了最佳职场机遇以及四项最佳投资中的三项。我总是惊...阅读全文