大规模集群仿真模拟与调度器压测方法

星辰算力平台基于深入优化云原生统一接入和多云调度,加固容器运行态隔离,挖掘技术增量价值,平台承载了腾讯内部的CPU和异构算力服务,是腾讯内部大规模离线作业、资源统一调度平台。

背景

在大规模 Kubernetes 集群中,集群瞬息万变,每时每刻可能都有相关用户、集群组件、运维人员对集群进行操作。根据大规模集群的注意事项,Kubernetes v1.26 单个集群支持的最大节点数为 5000。更具体地说,Kubernetes 旨在适应满足以下所有标准的配置:

  • 每个节点的 Pod 数量不超过 110
  • 节点数不超过 5000
  • Pod 总数不超过 150000
  • 容器总数不超过 300000

在这样大规模的集群下,通常我们需要压测各类组件来保障集群在突发状况(如高峰时间段)下的性能和可靠性。对于 apiserver、etcd 这类基础组件,我们只要将服务启动后,可以非常容易地进行压测,如通过 clusterloader2 并发创建大量的请求等方式。但针对调度器,我们却需要一个含有大量节点的集群进行模拟测试,但通常情况下很难短时准备如此多的空闲节点,且测试时对节点资源也是一种浪费。

万幸的是,调度器是负责将 Pod 调度到合适的 Node 上,并不关心后续 Pod 的生产过程。如果能够在集群中虚拟出大量的 Node,就可以完成大规模集群的模拟环境搭建。碰巧,Kubernetes 社区开源的新项目 KWOK(Kubernetes WithOut Kubelet) 为我们带来了解决方案。本文将阐述如何快速模拟大规模测试环境(你甚至可以在自己的 minikube 上搭建),并简要给出调度器的压测结果。同时,由于我们在生产环境中大量使用拓扑感知调度功能并已经贡献至 Crane 开源社区,本文中的压测环境也是基于带有拓扑感知调度增强功能的 crane-scheduler。

  • 大规模集群的注意事项:https://kubernetes.io/zh-cn/docs/setup/best-practices/cluster-large/
  • clusterloader2:https://github.com/kubernetes/perf-tests/blob/master/clusterloader2/docs/design.md
  • KWOK:https://github.com/kubernetes-sigs/kwok
  • Crane 开源社区:https://gocrane.io/
  • crane-scheduler:https://github.com/gocrane/crane-scheduler

环境准备

虚拟节点

环境信息:

  • 测试环境:含有300个真实节点的Kubernetes v1.22集群
  • kwok 版本:v0.0.1(这个版本用于调度测试可能有点小问题,见文章末尾)

部署 kwok:

  • 按照此文档进行部署(https://kwok-demo.netlify.app/docs/user/kwok-in-cluster/)
  • 查看 kwok-controller 已被正确部署:kubectl get pod -n kube-system app=kwok-controller

创建节点,按照生产环境下的 CVM 机型进行配置:

cat << EOF > /tmp/node.yaml 
apiVersion: v1
kind: Node
metadata:
  annotations:
    node.alpha.kubernetes.io/ttl: "0"
    kwok.x-k8s.io/node: fake
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: {NODE_NAME}
    kubernetes.io/os: linux
    kubernetes.io/role: agent
    node-role.kubernetes.io/agent: ""
    type: kwok
  name: {NODE_NAME}
spec:
  taints: # Avoid scheduling actual running pods to fake Node
    - effect: NoSchedule
      key: kwok.x-k8s.io/node
      value: fake
status:
  allocatable:
    cpu: 179800m
    ephemeral-storage: "289839513121"
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 64836160Ki
    pods: "64"
  capacity:
    cpu: "180"
    ephemeral-storage: 307125Mi
    hugepages-1Gi: "0"
    hugepages-2Mi: "0"
    memory: 65655360Ki
    pods: "64"
  nodeInfo:
    architecture: amd64
    bootID: ""
    containerRuntimeVersion: ""
    kernelVersion: ""
    kubeProxyVersion: fake
    kubeletVersion: fake
    machineID: ""
    operatingSystem: linux
    osImage: ""
    systemUUID: ""
  phase: Running
EOF

创建100个节点:

for i in {0..99}; do sed "s/{NODE_NAME}/kwok-node-$i/g" /tmp/node.yaml | kubectl apply -f -; done

可以看到100个节点均已 running:

$ kubectl get node
NAME           STATUS   ROLES                  AGE    VERSION
9.134.230.65   Ready    control-plane,master   122d   v1.23.3
kwok-node-0    Ready    agent                  70m    fake
kwok-node-1    Ready    agent                  71m    fake
...
kwok-node-99   Ready    agent                  70m    fake

部署Pod

在集群中按照文档创建 Pod 进行调度器测试。由于 kwok 的节点含有特定的标签和污点,所以 Pod 最好带有特定的  nodeAffinity 和  tolerations,这样可以确保 Pod 被调度到虚拟的节点上。

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fake-pod
  namespace: default
spec:
  replicas: 10
  selector:
    matchLabels:
      app: fake-pod
  template:
    metadata:
      labels:
        app: fake-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: type
                    operator: In
                    values:
                      - kwok
      # A taints was added to an automatically created Node.
      # You can remove taints of Node or add this tolerations.
      tolerations:
        - key: "kwok.x-k8s.io/node"
          operator: "Exists"
          effect: "NoSchedule"
      containers:
        - name: fake-container
          image: fake-image
EOF

部署NRT对象(可选)

针对带有拓扑感知插件的 crane-scheduler,需要创建 NRT 对象。

cat << EOF > /tmp/nrt.yaml 
apiVersion: topology.crane.io/v1alpha1
kind: NodeResourceTopology
metadata:
  name: {NODE_NAME}
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Node
    name: {NODE_NAME}
    uid: {NODE_UID}
craneManagerPolicy:
  cpuManagerPolicy: Static
  topologyManagerPolicy: SingleNUMANodePodLevel
reserved:
  cpu: 200m
  memory: 700Mi
zones:
- costs:
  - name: node0
    value: 10
  - name: node1
    value: 20
  name: node0
  resources:
    allocatable:
      cpu: 89800m
      memory: 31932648Ki
    capacity:
      cpu: "90"
      memory: 32649448Ki
    reservedCPUNums: 1
  type: Node
- costs:
  - name: node0
    value: 20
  - name: node1
    value: 10
  name: node1
  resources:
    allocatable:
      cpu: "90"
      memory: 33005912Ki
    capacity:
      cpu: "90"
      memory: 33005912Ki
  type: Node
EOF

创建对应的 NRT 对象:

for i in {0..99}; do uid=$(kubectl get node kwok-node-$i -ojsonpath='{.metadata.uid}'); sed "s/{NODE_NAME}/kwok-node-$i/g;s/{NODE_UID}/$uid/g" /tmp/nrt.yaml | kubectl apply -f -; done

删除虚拟节点

测试完成后如果想删除虚拟节点,可以直接删除掉所有的 kwok 节点。

kubectl delete node -l type=kwok

测试程序与误差分析

这里简单准备了一个测试程序(https://github.com/Garrybest/k8s-example)进行调度测试,它会统计某一个 namespace 下所有 Pod 的调度时间,通过 Pod 的 Condition 和 CreationTimestamp 进行判断,最后进行加和以及求平均的工作,这种方式是相对更加精确的。但由于 metav1.Time 结构在传输时采用 RFC3339 进行编码,只能精确到秒,因此会损失部分精度,在大规模测试中可以忽略不计。

当然,你也可以通过暴露调度器的 metrics 来做这项工作,但是我十分不建议在大规模压测时通过 grafana 看板进行调度时间的统计。因为调度器暴露的调度时间指标是通过 histogram 直方图的方式,而 histogram 是假定位于每个 bucket 的样本在该 bucket 内满足均匀分布。当压测进行时,短时间大量创建 Pod,必定有部分 Pod 的调度时长达到分钟级别,此时其所属的 bucket 范围更广,均匀分布的条件就越不可能成立,从 metrics 这统计的调度时间会产生很大的误差(https://hulining.gitbook.io/prometheus/practices/histograms#errors-of-quantile-estimation)。

测试结果

下表展示了最终测试结果。在我的环境下并没有进行调度器调优,也没有使用 clusterloader2 进行更加复杂的测试。读者可根据自己的需求选择不同的压测程序和工具。测试时设置调度器的QPS=200,Burst=400。

测试用例

节点数

并发创建Pod数

总调度时间(s)

平均调度时间(s)

每秒调度Pod数

CPU峰值

内存峰值(GiB)

goroutines峰值

1

5000

1000

8

3.849

125

0.29

1.93

502

2

5000

2000

17

8.917

117.6470588

0.578

3.32

1090

3

5000

5000

45

25.7236

111.1111111

1.39

6.09

1900

4

5000

10000

92

53.2814

108.6956522

3.15

10.3

3300

可以明显看出,每秒调度Pod数大概是在110左右达到极限,这对于大部分场景来说已经够了。我们发现耗时较多的阶段主要是Bind,通过调大QPS和Burst参数还可以将每秒调度Pod数继续提升至160左右。同时短时间创建大量的 Pod 会导致调度器内存飙升,这可能与调度器内部的 cache 有关。

后记

测试过程中顺手修了两个 kwok 的 Bug:

  • #141:kwok 原本把 PodScheduled 的 Condition 覆盖了,导致测试程序获取不到调度时长。
  • #142:kwok 在某些特殊情况下无法正常删除虚拟的节点。

这在 kwok-v0.0.1 的镜像里面是没有包含的,读者可自行从 master 分支编译一个镜像或等待下一个 release 版本发布。

本文转载于网络 如有侵权请联系删除

相关文章

  • 网站建设注意做好这三点将带来有效的客户量

    目前网站建设的数量越来越多,竞争也越来越激烈,企业网站怎样吸引更多有效的客户成了网站建设巨大的挑战。除了企业自身的实力以外,网站的细节处理是非常重要的方面,细节处理得不好也会让很多客户产生不信任感,因为网站的形象也代表了这个企业呈现给顾客的一种状态。1、色彩布局搭配网站的数量多,代表市场竞争大,网站建设中版面的布局一定要注意色彩的搭配,注意格调的统一,在着重的地方,我们可以使用鲜艳的颜色,吸引客户的点击,从而促成交易。2、主次信息分明有很多营销型的网站没有获得巨大的客户浏览量,主要原因还是自己的的定位信息不准确,主次信息没有明确,让很多顾客处于一种很模糊的境界,也为此流失了很多有效客户。因此,营销类的网站建设,一定要分清主次的关系,很好地突出自己的卖点和优势,不至于让客户感到迷茫。3、文字图片化随着生活节奏加快,大家对于大量文字的阅读渐渐失去了耐心,很多企业都发现了这个问题,为了适应客户的阅读习惯,我们开始改变以前的思维,采用文字图片化的方式对消费者进行吸引,让他们对我们的文字效果也能产生好感。如果一个网站没有客户,那最后一定是失败的效果。因此我们在网站推广方面,一定要做好,推广方式有

  • oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)

    大家好,又见面了,我是全栈君LAG()和LEAD()统计函数能够在一次查询中取出同一字段的前N行的数据和后N行的值。这样的操作能够使用对同样表的表连接来实现,只是使用LAG和LEAD有更高的效率。下面整理的LAG()和LEAD()样例:LAG(EXPRESSION,<OFFSET>,<DEFAULT>) SQL>selectyear,region,profit,lag(profit,1)over(orderbyyear)as51xit_expfromtest; YEARREGIONPROFIT51xit_exp —-——-———-————- 2003West88 2003West8888 2003Central10188 2003Central100101 2003East102100 2004West77102 2004East10377 2004West89103LEAD(EXPRESION,<OFFSET>,<DEFAULT>) SQL>selectyear,region,profit,lead(profit,1)ove

  • linux如何查看nginx是否启动

    Nginx是一个高性能的反向代理服务器,现在一般作为我们网站或其他Web服务的第一层代理,用户在浏览器请求首先经过的就是Nginx服务。如果Nginx服务没有启动或异常结束,将会影响Web服务的正常使用。下面我将在Linux中查看Nginx是否启动的过程记录,分享出来。工具/原料LinuxNginx通过进程判断 第一种方法:查看进程列表并过滤 Linux每个应用运行都会产生一个进程,那么我们就可以通过查看Nginx进程是否存在来判断它是否启动。 用ps-ef列出进程列表,然后通过grep过滤。 如:ps-ef|grepnginx就可以看到Nginx进程是否存在了。 第二种方法:直接查看进程id ps-Cnginx-opid 这种直接返回pid的方式比较适合跟其他程序结合使用,比如在shell/python脚本中执行这个命令拿到pid,让后根据pid来判断Nginx是否启动。 推荐使用这种方式。 END通过端口判断第三种方法:使用netstat命令 如果我们的Nginx运行在80端口,那么就可以通过netstat-anp|grep:80命令来判断Nginx是否启动。 第四种方

  • Tomcat NIO(17)-流式上传文件

    在上一篇文章中我们主要介绍tomcatnio中对文件上传的原生支持,其本质是通过调用消费servletinputstream相关API,先把文件上传到tomcat的工作目录中。然后通过getPart()等API得到已经在工作目录中文件的磁盘inputstream,name,size等信息,然后根据自身逻辑进行操作。这种上传方式需要考虑tomcat工作目录磁盘空间大小,清理,权限等问题,由于涉及网络设备,磁盘设备,os内核空间和程序的用户空间多次切换,所以在数量比较大的情况下会有效率问题。这里我们主要介绍流式上传,以解决原生上传带来的问题。对于原生上传来说,是把http请求的文件输入流写入tomcat工作目录的磁盘中,流式上传的思路是不把输入流写入磁盘,而是直接把输入流交给应用程序,这样就避免了写磁盘的中转操作,提高了效率。所以我们可以从tomcat源码中把请求的文件输入流写入磁盘中的逻辑入手,核心代码在ServletFileUpload的parseRequest()方法中://ServletFileUpload publicFileItemIteratorgetItemIterator

  • PG13 B-tree索引去重

    PG13:btree索引去重正文PG13一个重要的特性就是Btree索引去重。使得物理文件大小更小,减小IO,帮助提升select性能。GIN索引,如果不同行的索引键相同,那么会存储一个索引条目。指向多条行(tupleIDs)的指针存储到行记录的postinglist中。B-tree相反,需要对于每条行记录都存储一条索引记录。这样有利于维护但是导致很多重复的索引记录。Commit0d86bbb70引入了B-tree索引去重。只在索引页分裂的时候去重。这些额外的工作被减少页分裂次数和索引大小平衡掉。不会影响唯一索引?每次update都会创建一个新的行,每个行版本都需要被索引。因此一个唯一索引也会包含相同索引记录多次。如果update频繁时,也会减小唯一索引膨胀。优点减小索引空间大小,帮助节省磁盘空间。更重的是尽可能在RAM中缓存索引,使得扫描索引更快并减小索引膨胀。升级注意事项通过pg_upgrade升级,需要执行REDINDEX。通过pg_dumpall及restore或使用逻辑复制重建索引时,自动去重。设置deduplicate_items=off,使用老的行为。测试CREATETA

  • Nginx 极简教程(快速入门)

    Nginx极简教程本项目是一个Nginx极简教程,目的在于帮助新手快速入门Nginx。简介:什么是Nginx?Nginx(enginex)是一款轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。什么是反向代理?反向代理(ReverseProxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。Nginx入门详细安装方法请参考:https://github.com/dunwu/nginx-tutorial/blob/master/install-nginx.mdnginx的使用比较简单,就是几条命令。常用到的命令如下:nginx-sstop快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。 nginx-squit平稳关闭Nginx,保存相关信息,有安排的结束web服务。 nginx-sreload因改变了Nginx相关配置,需要重新加载配置而重载。 nginx-sreopen重新打开日志文件。

  • React学习(6)—— 高阶应用:非受控组件

    非受控组件使用非受控组件在大部分情况下,推荐使用受控组件来实现表单、输入框等状态控制。在受控组件中,表单等数据都有React组件自己处理。这里将介绍另外一种非受控组件,表单的数据有Dom自己控制。非受控组件实现的重点是用Refs特性获取真实Dom来代替每次数据变更去更新组件的状态值。例如下面的代码,在非受控组件中记录被用户输入的名字:classNameFormextendsReact.Component{ constructor(props){ super(props); this.handleSubmit=this.handleSubmit.bind(this); } handleSubmit(event){ //在提交时,直接使用ref获取的真实Dom获取值 alert('Anamewassubmitted:'+this.input.value); event.preventDefault(); } render(){ return( <formonSubmit={this.handleSubmit}> <label> Name: &

  • 01字典树贪心查询+建立+删除(个人模版)

    01字典树贪心查询+建立+删除:1#definemaxn2 2typedefstructtree 3{ 4tree*nex[maxn]; 5intv; 6intval; 7}tree; 8treeroot; 9voidinit() 10{ 11for(inti=0;i<maxn;i++) 12{ 13root.nex[i]=NULL; 14} 15} 16voidcreat(char*str,intva) 17{ 18intlen=strlen(str); 19tree*p=&root,*q; 20for(inti=0;i<len;i++) 21{ 22intid=str[i]-'0'; 23if(p->nex[id]==NULL) 24{ 25q=(tree*)malloc(sizeof(root)); 26q->v=1; 27for(intj=0;j<2;j++) 28{ 29q->nex[j]=NULL; 30} 31p->nex[id]=q; 32} 33else 34{ 35p->nex[id]-&g

  • GDI透明贴图

    网上下载的图片,有一些会有水印。水印的实现可以用透明贴图来做。透明贴图就是让两张图片合并的时候,重叠的部分中使一些颜色不显示,从而达到透明的效果。如果用GDI来实现的话,具体方法步骤可多可少,少的可以使用一个SDK函数就解决。工程下载地址:点击打开链接背景图片:前景图片:实现效果:成功把星星画上去了。先看下面的资料://如果一个单色位图向彩色位图转换,那么单色位图为1的部分(也就是白色部分),会转换为彩色位图的背景色,单色位图为0的部分(黑色部分),会转换为彩色位图的前景色。 //如果一个彩色位图向单色位图转换,那么彩色位图的背景色转换到单色位图中则为1(白色),其他的则转换为0(黑色)。 //当然上面的1和0都是指bit位的值,还有这些转换是在设备上下文间的块数据操作前就进行的。 //由于windows上所有的位图操作都是基于内存设备上下文的,所以我们还需要创建两个设备上下文分别用于存放源位图和“掩码”位图。 //位图在设备上下文之间块数据传递需要通过Biltblt实现,对于这个函数和关于bitblt的最后一个参数的光栅操作的具体含义的介绍,这里就不再赘述,具体可看MSDN上关于bi

  • 南海网络谍影 | F-Secure报告之木马NanHaiShu分析

    声明:本文为F-Secure报告翻译,文中及的观点立场不代表本网站观点立场。1.前言本报告描述了我们发现并命名的木马-NanHaiShu(NanHaiRAT)。基于我们的技术分析表明,该木马的主要攻击对象为政府和私营机构,其中包括几个值得注意的目标:菲律宾司法部、亚太经合组织APEC峰会组织者和一家跨国律师事务所。我们认为,以上组织机构和南海争议问题相关,所以被攻击者列入了渗透攻击目标。而最近的核心冲突问题便是2016年7月12日的南海仲裁案。根据对NanHaiShu木马的技术分析,结合几个被入侵的特定目标,我们确定了木马的攻击源。两年前我们捕获了NanHaiShu木马的第一个样本,截至2016年3月,该木马的攻击活动仍然处于活跃状态。攻击者通过在邮件附件中捆绑NanHaiShu木马进行鱼叉式邮件攻击,若木马被成功植入,将会向远程C&C服务器建立信息回传通道。2.相关信息(1)木马传播方式攻击者通过精心构造邮件内容,向特定目标发送鱼叉式邮件。例如,攻击律师事务所的邮件包含薪资和财政事宜,为了诱骗邮件接收者,攻击者还以社工方式“精心”编写了相关邮件内容。图针对律师事务所雇员的鱼叉

  • Next.js 笔记

    NEXT中文文档地址! next.js只有服务端使用的包需要做单独处理,无需打包到项目中,可以使用@zeit/next-bundle-analyzer观察代码。 Router.beforePopState()截断Router操作的设置只有在客户端生效(需在componentDidMount中设置)且进入此函数中的方法只有Router栈中有值的时候才可以! next.js中设置绝对路径的方法是在next.config.js中wepack方法中的config参数增加配置。 next.js中配置自定义接口可以使用自定义启动参数,创建server.js通过nodeserver.js启动。 next.js支持IE11和各主流浏览器IE11以内的IE版本不支持。 Link标签passHref属性可以强制给子元素传递href属性,有利于SEO优化。 windows不支持NODE_ENV=development的设置方式导入cross-env然后运行时在前面添加cross-env即可解决。 webpack配置自定义的时候覆盖配置需要继承本有的配置,否则会使next解析错误(analysiserror

  • 模板整理

    因为作者又懒又菜还健忘,所以要整理一下模板。 SA charc[N]; intn,m,height[N],sa[N],rk[N],a[N],b[N],d[N]; voiddoubling(){ rep(i,1,n)b[a[i]=c[i]]++;//b数组是桶,a[i]是第i个元素的第一关键字 rep(i,2,m)b[i]+=b[i-1];//做b的前缀和,得出每个关键字最多的名次 per(i,n,1)sa[b[a[i]]--]=i; for(intk=1,p=0;k<=n;k<<=1,m=p,p=0){ rep(i,n-k+1,n)d[++p]=i; //d[i]表示第二关键字排名为i的数,第一关键字的位置 //第n-k+1到第n位是没有第二关键字的排名最前 rep(i,1,n)if(sa[i]>k)d[++p]=sa[i]-k; //排名为i的数在数组中是否在第k位以后 //如果满足(sa[i]>k)可以作为第二关键字,将其第一关键字的位置添加进y //所以i枚举的是第二关键字的排名,第二关键字靠前的先入队 rep(i,1,m

  • prometheus容器部署方式

    方式一:关于PrometheusOperator相关的下载源码地址https://github.com/prometheus-operator/kube-prometheus.git     方式二:关于kube-prometheus-stack相关的 helm部署 https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack  

  • C# ASCII码的转换、转义字符、对照表

      varsplitStr=newbyte[]{0x05,0x0D,0x0A};//varsplitStr=newbyte[]{5,13,10};这样写也可以 varresult=System.Text.Encoding.ASCII.GetString(splitStr);结果是:\u0005\r\n复制 如上图,当已知道一个ASCII码的时候,可以通过System.Text.Encoding.ASCII.GetString(byte[]buffer)方法来获取C#中的表示方法; 可以通过把128种或者256种ASCII码在C#中的表示对应起来。

  • 如何选择合适的云服务器?

    如今,使用云服务器建站已经成为站长们的首选,但在选择云服务器时免不了要头痛,毕竟市场上的云服务器众多,如何选择合适自己的云服务器就变得至关重要了。  这里,小编推荐一款优豆云主机免/费主机的使用感受及实际操作配图,cpu/内存/硬盘都很给力。因为这年头,竟然有"免/费虚拟主机"“免/费云服务器”?真是想都不敢想啊。 1.首先需要确定网站的基本情况  1)网站类型 网站是以静态还是动态为主,使用什么网站程序,对运行环境有何要求,是否需要配置特定的环境?  2)网站访问量 网站的日均访问人数和同时在线平均人数有多少?  3)网站数据大小 网站目前的数据量有多大,未来是否会持续快速增加?  4)网站目标用户 网站是面向全国用户还是本地用户?  这些情况都是必须要了解的,这对与选择机房、配置、带宽等起了决定性的作用。  2.如何选择?  1)CPU 如果网站访问流量较大,动态页面比较多,建议选择2核以上的CPU。  2)内存 内存越大,则可用缓存越大,打开速度也就越快,建议选择1G以上的内存。 

  • 织梦导航外链打不开

    修改方法include/taglib/channelartlist.lib.php第67左右 $tpsql="reid=0ANDispart<>2ANDishidden<>1ANDchanneltype>0";复制 改成 $tpsql="reid=0ANDishidden<>1ANDchanneltype>0";复制 73行 { if(!preg_match('#,#',$typeid)){ //$tpsql="reid='$typeid'ANDispart<>2ANDishidden<>1"; $tpsql="reid='$typeid'ANDishidden<>1"; } else{ //$tpsql="idIN($typeid)ANDispart<>2ANDishidden<>1"; $tpsql="idIN($typeid)ANDishidden<>1"; } }复制 新窗口 $pv->Fields['typeurl']=GetOneTyp

  • Jquery实现搜索框提示功能

    博客的前某一篇文章中http://www.cnblogs.com/hEnius/p/2013-07-01.html写过一个用Ajax来实现一个文本框输入的提示功能。最近在一个管理项目的项目中,使用后发现,真的反应很慢,数据量很大的情况下使用Ajax去实现真的不合适,于是,我又写了一个使用Jquery来实现方法。 废话不多说,上图上代码: 引用方式: <bodystyle="background-color:White;"> <formid="form1"runat="server"> <divid="filter_stationType"></div> <divclass="gover_search"width="100%"> <divclass="gover_search_formclearfix"width="100%"> <spanclass="search_t"><b>按项目名称检索:</b></span>        <%--autoc

  • postgresql+postgis+pgrouting实现最短路径查询(1)---线数据的处理和建立拓扑

    准备一个线shp数据,并将其导入postgres里面,postgres安装postgis和pgrouting两个插件(方法见http://www.cnblogs.com/nidaye/p/4553522.html)。线数据的字段如下:注意字段的名称,省的出现不必要的麻烦。 1、ALTERTABLEbeijing_lineADDCOLUMNsourceinteger;  ALTERTABLEbeijing_lineADDCOLUMNtargetinteger;  ALTERTABLEbeijing_lineADDCOLUMNlengthdoubleprecision;  UPDATEbeijing_lineSETlength=ST_Length(the_geom);   ps:执行createTopology这个函数之前一定得对数据库执行以下三句sql查询: CREATEEXTENSIONpostgis; CREATEEXTENSIONpostgis_topology; CREATEEXTENSIONfuzzystrmatch; 2、selectp

  • vscode中使用xdebug

    php.ini [XDebug] zend_extension=php_xdebug-2.9.4-7.1-vc14-nts.dll xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_handler="dbgp" xdebug.remote_port="9001" xdebug.remote_host="127.0.0.1"vscode配置{    // 使用 IntelliSense 了解相关属性。     // 悬停以查看现有属性的描述。    // 欲了解更多信息,请访问: 复制 https://go.microsoft.com/fwlink/?linkid=830387    "version": "0.2.0",   &nbs

  • [DFNews] GetData也出取证软件了

    从事计算机取证的应该都听说过MIP(MountImagePro)、VFC仿真和RecoverMyFiles,上述三个应用比较广泛的软件都是GetData公司的产品。GetData现在也推出了自己的计算机取证软件ForensicExplorer。 详细信息可以参考: http://www.forensicexplorer.com/  从价格来看,的确不贵,一套ForensicExplorer(含MIPv5)带一年SMS收费$949,增加一年SMS$299,价格堪称良心,具体功能还有待测试。

  • Smarty 模板引擎简介

    前言 Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。作为一个前端工程师了解Smarty也很有必要,本文是从官方文档上归纳出来的简明教程,以备快速查阅。 1.基本语法 所有的smarty模板标签都被加上了定界符。默认情况下是{和},但它们是可被改变的,可以进行自定义设置。 Comments[注释] 示例: {*Smarty*}复制 Functions[函数] 每一个smarty标签输出一个变量或者调用某种函数。在定界符内函数(用'{'包住)和其属性(用界符包住)将被处理和输出。 示例: {config_loadfile="colors.conf"} {includefile="header.tpl"} {if$highlight_name} W

相关推荐

推荐阅读