深圳搬家搬厂网站建设公司
当前位置:网站首页 > 新闻动态 > HTTP500解决办法(记一次K8S POD频繁重启的优化之旅)1.背景 返回列表

HTTP500解决办法(记一次K8S POD频繁重启的优化之旅)1.背景

发布时间:2023-12-05来源:网站建设公司

1.背景

最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下。

听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次。对于技术人员来说,这既是压力也是动力,大多数时候我们都是沉浸在单调的业务开发中,对自我的提升有限,久而久之可能会陷入一种舒适区,遇到这种救火案例一时间会有点无所适从,但是没关系,毕竟......

“我只是收了火,但没有熄炉”,借用电影中的一句话表达一下此时的心情。

2.初看日志

我当即就看这个服务的运行日志,里面有大量的oom异常,如下:

org.springframework.web.util.NestedServletException: Handlerdispatchfailed; nestedexceptionisjava.lang.OutOfMemoryError: GCoverheadlimitexceeded

整个服务基本可以说处于不可用状态,任何请求过来几乎都会报oom,但是这跟重启有什么关系呢?是谁触发了重启呢?这里我暂时卖个关子,后面进行解答。

3.k8s健康检查介绍

我们的服务部署在k8s中,k8s可以对容器执行定期的诊断,要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。有三种类型的处理程序:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction:对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • Success(成功):容器通过了诊断。
  • Failure(失败):容器未通过诊断。
  • Unknown(未知):诊断失败,因此不会采取任何行动。

针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

  • livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。
  • readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。初始延迟之前的就绪态的状态值默认为 Failure。如果容器不提供就绪态探针,则默认状态为 Success。
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。如果容器没有提供启动探测,则默认状态为 Success。

以上探针介绍内容来源于https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

看完探针的相关介绍,可以基本回答上面的疑点**“oom和重启有什么关系?”,**是livenessProbe的锅,简单描述一下为什么:

  1. 服务启动;
  2. k8s通过livenessProbe中配置的健康检查Handler做定期诊断(我们配置的是HttpGetAction);
  3. 由于oom所以HttpGetAction返回的http status code是500,被k8s认定为Failure(失败)-容器未通过诊断;
  4. k8s认为pod不健康,决定“杀死”它然后重新启动。

这是服务的Deployment.yml中关于livenessProbe和restartPolicy的配置

livenessProbe:failureThreshold:5httpGet:path:/healthport:8080scheme:HTTPinitialDelaySeconds:180periodSeconds:20successThreshold:1timeoutSeconds:10restartPolicy:Always

4.第一次优化

内存溢出无外乎内存不够用了,而这种不够用又粗略分两种情况:

  1. 存在内存泄漏情况,本来应该清理的对象但是并没有被清理,比如HashMap以自定义对象作为Key时对hashCode和equals方法处理不当时可能会发生;
  2. 内存确实不够用了,比如访问量突然上来了;

由于我们这个是一个老服务,而且在多个客户私有化环境都部署过,都没出过这个问题,所以我直接排除了内存泄漏的情况,那就将目光投向第二种“内存确实不够用”,通过对比访问日志和询问业务人员后得知最近客户在大力推广系统,所以访问量确实是上来了。

“不要一开始就陷入技术人员的固化思维,认为是程序存在问题”

知道了原因那解决手段也就很粗暴了,加内存呗,分分钟改完重新发布。

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

终于发布完成,我打开监控平台查看服务的运行情况,这次日志里确实没有oom的字样,本次优化以迅雷不及掩耳之势这么快就完了?果然是我想多了,一阵过后我眼睁睁看着pod再次重启,但诡异的是程序日志里没有oom,这一次是什么造成了它重启呢?

我使用kubectl describe pod命令查看一下pod的详细信息,重点关注Last State,里面包括上一次的退出原因和退回code。

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

可以看到上一次退出是由于OOMKilled,字面意思就是pod由于内存溢出被kill,这里的OOMKilled和之前提到的程序日志中输出的oom异常可千万不要混为一谈,如果pod 中的limit 资源设置较小,会运行内存不足导致 OOMKilled,这个是k8s层面的oom,这里借助官网的文档顺便介绍一下pod和容器中的内存限制。

以下pod内存限制内容来源于https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/

*要为容器指定内存请求,请在容器资源清单中包含 *resources:requests字段。同理,要指定内存限制,请包含 resources:limits。

以下deployment.yml将创建一个拥有一个容器的 Pod。容器将会请求 100 MiB 内存,并且内存会被限制在 200 MiB 以内:

apiVersion: v1 kind: Pod metadata: name: memory-demo namespace: mem-example spec: containers: - name: memory-demo-ctr image: polinux/stress resources: limits: memory: "200Mi"requests: memory: "100Mi"command: ["stress"] args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

当节点拥有足够的可用内存时,容器可以使用其请求的内存。但是,容器不允许使用超过其限制的内存。如果容器分配的内存超过其限制,该容器会成为被终止的候选容器。如果容器继续消耗超出其限制的内存,则终止容器。如果终止的容器可以被重启,则 kubelet 会重新启动它,就像其他任何类型的运行时失败一样。

回归到我们的场景中来讲,虽然把jvm内存提高了,但是其运行环境(pod、容器)的内存限制并没有提高,所以自然是达不到预期状态的,解决方式也是很简单了,提高deployment.yml中memory的限制,比如jvm中-Xmx为1G,那memory的limits至少应该大于1G。

至此,第一次优化算是真正告一段落。

5.第二次优化

第一次优化只给我们带来了短暂的平静,重启次数确实有所下降,但是离我们追求的目标还是相差甚远,所以亟需来一次更彻底的优化,来捍卫技术人员的尊严,毕竟我们都是头顶别墅的人。

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

头顶撑不住的时候,吃点好的补补

上一次频繁重启是因为内存不足导致大量的oom异常,最终k8s健康检查机制认为pod不健康触发了重启,优化手段就是加大jvm和pod的内存,这一次的重启是因为什么呢?

前面说过k8s对http形式的健康检查地址做探测时,如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的,否则就认为失败,这里其实忽略了一种极其普遍的情况“超时”,如果超时了也一并会归为失败。

为什么这里才引出超时呢,因为之前日志中有大量的报错,很直观的可以联想到健康检查一定失败,反观这次并没有直接证据,逼迫着发挥想象力(其实后来知道通过kubectl describe pod是可以直接观测到超时这种情况的)。

现在我们就去反推有哪些情况会造成超时:

1.cpu 100%,这个之前确实遇到过一次,是因为宿主机cpu 100%,造成大量pod停止响应,最终大面积重启;

2.网络层面出了问题,比如tcp队列被打满,导致请求得不到处理。

3.web容器比如tomcat、jetty的线程池饱和了,这时后来的任务会堆积在线程池的队列中;

4.jvm卡顿了,比如让开发闻风丧胆的fullgc+stw;

以上四种只是通过我的认知列举的,水平有限,更多情况欢迎大家补充。

现在我们一一排除,揪出元凶

1.看了监控宿主机负载正常,cpu正常,所以排除宿主机的问题;

2.ss -lnt查看tcp队列情况,并没有堆积、溢出情况,排除网络层面问题;

3.jstack查看线程情况,worker线程稍多但没有到最大值,排除线程池满的情况;

4.jstat gcutil查看gc情况,gc比较严重,老年代gc执行一次平均耗时1秒左右,持续时间50s到60s左右嫌疑非常大。

通过上面的排除法暂定是gc带来的stw导致jvm卡顿,最终导致健康检查超时,顺着这个思路我们先优化一把看看效果。

开始之前先补一张gc耗时的截图,为了查看的直观性,此图由arthas的dashboard产生。

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

说实话我对gc是没有什么调优经验的,虽然看过比较多的文章,但是连纸上谈兵都达不到,这次也是硬着头皮进行一次“调参”,调优这件事真是不敢当。

具体怎么调参呢,通过上面gc耗时的分布,很直观的拿到一个讯息,老年代的gc耗时有点长,而且次数比较频繁,虽然图里只有40次,但是相对于这个服务的启动时间来讲已经算频繁了,所以目标就是降低老年代gc频率。

从我了解的gc知识来看,老年代gc频繁是由于对象过早晋升导致,本来应该等到age达到晋升阈值才晋升到老年代的,但是由于年轻代内存不足,所以提前晋升到了老年代,晋升率过高是导致老年代gc频繁的主要原因,所以最终转化为如何降低晋升率,有两种办法:

1.增大年轻代大小,对象在年轻代得到回收,只有生命周期长的对象才进入老年代,这样老年代增速变慢,gc频率也就降下来了;

2.优化程序,降低对象的生存时间,尽量在young gc阶段回收对象。

由于我对这个服务并不是很熟悉,所以很自然的倾向于方法1“调整内存”,具体要怎么调整呢,这里借用一下美团技术博客中提到的一个公式来抛砖一下:

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

图片内容来源于https://tech.meituan.com/2017/12/29/jvm-optimize.html

结合之前的那张gc耗时图可以知道这个服务活跃数据大小为750m,进而得出jvm内存各区域的配比如下:

年轻代:750m*1.5 = 1125m

老年代:750m*2.5 = 1875m

接下来通过调整过的jvm内存配比重新发布验证效果,通过一段时间的观察,老年代gc频率很明显降下来了,大部分对象在新生代被回收,整体stw时间减少,运行一个多月再没有遇到自动重启的情况,由此也验证了我之前的猜测“因为持续的gc导致健康检查超时,进而触发重启”。

至此,第二次优化告一段落。

6.第三次优化

第二次优化确实给我们带来了一段时间的安宁,后续的一个多月宕机率的统计不至于啪啪打架构部的脸。

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

刚安生几天,这不又来活了

http500解决办法(记一次k8s pod频繁重启的优化之旅)1.背景

有运维反馈某服务在北京客户的私有化部署环境有重启现象,频率基本上在2天一次,接收到这个讯息以后我们立马重视起来,先确定两个事:

1.个例还是普遍现象-个例,只在这个客户环境出现

2.会不会和前两次优化的问题一样,都是内存设置不合适导致的-不是,新服务,内存占用不高,gc也还好

结合前面的两个推论**“个例”+“新服务,各项指标暂时正常“,**我怀疑会不会是给这个客户新做的某个功能存在bug,因为目前使用频率不高,所以积攒一段时间才把服务拖垮。带着这个疑惑我采取了守株待兔的方式,shell写一个定时任务,每5s输出一下关键指标数据,定时任务如下:

#!/bin/bash whiletrue; do/bin/sleep 5 netstat -n | awk ''/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}''>> netstat.log ss -lnt >> ss.log jstack 1 >> jstack.log done

主要关注的指标有网络情况、tcp队列情况、线程栈情况。

就这样,一天以后这个服务终于重启了,我一一检查netstat.log,ss.log,jstack.log这几个文件,在jstack.log中问题原因剥茧抽丝般显现出来,贴一段stack信息让大家一睹为快:

"qtp1819038759-2508"#2508 prio=5 os_prio=0 tid=0x00005613a850c800 nid=0x4a39 waiting on condition [0x00007fe09ff25000]java.lang.Thread.State: WAITING (parking)atsun.misc.Unsafe.park(Native Method)-parking to wait for <0x00000007221fc9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:175)atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2044)atorg.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:393)atorg.apache.http.pool.AbstractConnPool.access$300(AbstractConnPool.java:70)atorg.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:253)-locked <0x00000007199cc158> (a org.apache.http.pool.AbstractConnPool$2)atorg.apache.http.pool.AbstractConnPool$2.get(AbstractConnPool.java:198)atorg.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:306)atorg.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:282)atorg.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)atorg.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)atorg.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)atorg.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)atorg.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)atcom.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:125)atcom.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)atcom.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)atcom.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)atcom.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:149)atcom.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)atcom.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:273)atcom.aliyun.oss.OSSClient.getObject(OSSClient.java:551)atcom.aliyun.oss.OSSClient.getObject(OSSClient.java:539)atxxx.OssFileUtil.downFile(OssFileUtil.java:212)

大量的线程hang在了 org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:282

这个是做什么的呢?这个正是HttpClient中的连接池满了的迹象,线程在等待可用连接,最终导致jetty的线程被打满,造成服务假死,自然是不能及时响应健康检查,最终触发k8s的重启策略。

最终通过排查代码发现是由于使用阿里云oss sdk不规范导致连接没有按时归还,久而久之就造成了连接池、线程池被占满的情况,至于为什么只有北京客户有这个问题是因为只有这一家配置了oss存储,而且这个属于新支持的功能,目前尚处于试点阶段,所以短时间量不大,1到2天才出现一次重启事故。

解决办法很简单,就是及时关闭ossObject,防止连接泄漏。

7.总结

通过前前后后一个多月的持续优化,服务的可用性又提高了一个台阶,于我而言收获颇丰,对于jvm知识又回顾了一遍,也能结合以往知识进行简单的调参,对于k8s这一黑盒,也不再那么陌生,学习了基本的概念和一些简单的运维指令,最后还是要说一句“工程师对于自己写的每一行代码都要心生敬畏,否则可能就会给公司和客户带来资损”。

阅读过此文章的读者,还阅读过下面的文章

  • 深圳网站制作好后来年到期了该怎么办
    <p> 深圳网站制作好后来年到期了该怎么办,不管是个人还是公司,要想制作好一个网站真的不容易,不仅仅需要做网站前期的规划和策划工作,还需要对网站建设的栏目,内容进行填充和建设,面对这一堆的要求和东西,整体还是比较麻烦和费事的,所以,网站建设制作好之后,一定要注意来年的续费问题,好多公司不注意这个问题,造成了网站后期打不开了,不能正常方面了,出现了问题才想起来网站没有续费,接下来我们来看看深圳网络公司是如何建议的。 </p> <p> 1.域名到期的影响<br /> &nbsp;一般情况下,网站域名需要一年进行一次续费,也可以一次购买多年,如果域名到期没有及时续费,网站就会打不开,域名续费期一般是一个月,过了这个时间就会进入赎回期,这时候就不能续费了。<br /> &nbsp;2.服务器到期的影响<br /> &nbsp;服务器到期与域名一样,到期后网站同样不能打开,如果之前网站在做推广,会直接影响展现效果,长时间不续费的话,网站数据就会全部删除了,之前的努力就全白做了。<br /> &nbsp;3.网站维护服务到期<br /> &nbsp;有些网络公司服务商会有网站维护费用,一般都是一年为一个期限,如果到期后您没有及时维护,网站出现问题后就不会有人给您维护,就会造成影响。影响最大的就是网站展现的效果。<br /> </p>
  • 深圳做网站公司做网站时要明白这些
    <p> 深圳做网站公司做网站时要明白这些。其实做网站有的时候不仅仅是在做网站,更多的是在帮助其他公司在做网络宣传门户,站在这个角度上你就知道你所承担的责任了,作为现在公司网站建设不仅要符合时代潮流,更多的需要紧扣时代网页设计特色和要求,只有这样制作设计出来的网站才能更好的满足现在人们的使用要求和观念的,不管是在网站设计理念,网站布局规划,以及网站内容建设等等,这些方面都需要进口时代主题和要求的,接下来我们来看看深圳网站制作公司是如何做的,需要做好那些方面的要求和规范呢? </p> <p> 审美在变,网站设计要紧跟潮流<br /> 也许用户访问时,不会逐一阅读网站内容,但首先映入眼帘的一定是设计。也许网站在几年前设计制作的确实很漂亮,但是我们无法否认的事实是,用户对网站设计的审美一直在不断改变。这个比较容易对比,随便找一个行业,然后通过百度搜索到十家网站,分别对应年份和网站的网址,让一个不知情的人去逐一打开并评判感受。大体趋势是越是新近设计制作的网站,越容易赢得用户的接受承认。其实这就是用户的真实感受,每年快速改版重做对于很多公司来说有些压力,但是笔者认为一般而言网站2-3年是需要重新设计制作快速的。一个通过网站寻找供应商的用户,其浏览网站一般也就几十秒到几分钟时间,先进的网站设计效果是吸引其深入了解进而咨询的较好方法。<br /> 技术在变,网站制作要贴合需求<br /> 周围的一切都在发生着巨变,网站技术也是如此,此前被很多网站公司采用的ASP网站开发语言几乎已经没人使用,相对于传统的PC端网站,现在更多看重的是移动端,公司设计制作的网站现在多为自适应PC端、PAD端以及手持移动终端的响应式网站。谁也不知道网站技术会走向哪个方向,但是对于普通的企业而言,我们可以把握趋势,至少每隔两三年对网站重新快速设计制作。<br /> 企业在变,网站建设要适应发展<br /> 网站总是为企业服务的,换句话说就是网站的设计制作需要跟上企业的发展步伐。现在急剧变化的市场面前,如果想立于不败之地,企业的经营策略一定在不断调整优化。作为给企业发展提供服务的网站,其理应不断调整不断优化以适应公司需求。现在是互联网时代,用户了解公司更多的也是通过网络,网站不仅是营销的工具,更是企业品牌形象的展示窗口。由于人力成本的不断升高,而网站设计更多的需要技术人员手工完成,所以真正定制开发的网站都价格不菲。但是同样是网站建设公司网站改版也不一定就选择定制,如果有合适的模板网站,也是不做的选择。我们需要的是一个紧跟时代和用户需求的网站,而非一定采用哪种方式实现它。 </p>
  • 英文网站制作需要注意那些问题和事项
    英文网站制作需要注意那些问题和事项。英文网站制作还是跟中文网站制作有比较大的区别的,应为中文网站面对的客户群体是国内的用户,而国内的用户对网站的使用习惯,要求都是跟国外不一样的,从而在制作英文网站的时候,一定要注意,像这种英文网站制作还是需要从国外人使用网站的习惯,使用网站的一些喜好出发,只有这样制作出来的网站满足国外人的使用的,这是一个方面,另外一个方面就是国外网站面对的搜索引擎,也是不一样的,国外的搜索引擎跟国内有着比较大的区别的,搜索引擎也是制作英文网站必须要考虑的一个方面了,最后就是网站制作价格方面了,一般英文网站制作价格要比国内的网站制作价格高一些,这是一定的,毕竟国外网站制作的细节要求,以及针对搜索引擎优化方面还是有比较高的要求的,所以,这些都是工作量,也都是需要处理好这些方面的细节工作的。
  • 网站设计公司的发展趋势详解
    <p> 网站设计公司的发展趋势详解,目前网页设计公司慢慢的转型升级成为一种综合性的设计公司了,不仅仅是在网站设计了,如果单纯的依赖于网站设计,对于这样的公司来说现在还是很被动的,并且目前的网站制作价格已经白热化了,竞争也是很大的情况下,好多公司已经赚不到什么钱了,面对这样的市场形式,作为网站设计公司要不断的扩大和尝试新的方式和方法,实现公司业务的升级和转型,这也是摆在深圳<a href="http://www.szbc888.com" target="_blank"><strong>网站制作公司</strong></a>面对不可逾越的一个问题了,毕竟现在网站制作公司的活量不大,如果养一个专业的网页设计技术团队专门作网站,根本养活不了这样的公司的发展了,更多的还需要通过其他的渠道,其他的平台上获得更为有质量的客户,这也是当下网站制作公司不得不面对的一个话题了。 </p> <p> <img src="static/picture/20231030113846_47114.jpg" alt="" /> </p> <p> <a href="http://www.szbc888.com" target="_blank"><strong>网页设计公司</strong></a>业务范围扩大,于是着这个网站制作行业市场需求量在逐渐的缩小,并且凡是使用到网站的多半集中在一些公司,单位方面的需求了,对于一些个人对网站的需求还是很少的,除非一些专业化路线的个人才会这样做的,网站设计公司的转型升级,不仅提升的服务质量,更多的将服务方位不断的扩大,从而得到更好的市场群体,能够为更多的市场客户服务。 </p>
  • 网站制作低价格策略已经成为网站制作行业的杀手锏
    <p> 网站制作低价格策略已经成为网站制作行业的杀手锏,整个大环境不好的情况下,好多公司在制作网站的时候,已经在想尽办法降低网站制作的成本了,从当初的网站制作就直接去搜索引擎上搜索网站制作公司了,而如今制作网站已经发生变化了,从搜索引擎走向了淘宝,拼多多这些低价平台了,并且这些平台都是担保交易了,好多的需要<a href="http://www.szbc888.com" target="_blank"><strong>制作公司网站</strong></a>的商家慢慢转向这个方面来了,所以制作出来的网站不是模板的就是仿制的网站,价格的确很低,并且效率也是很高的,这也是聪明的用户慢慢的转型和变化了,如果这些模板网站放在搜索引擎来的客户的话,这些网站制作下来的费用基本上在好几千了,面对这样的市场转型和升级,这也让好多网站制作公司寻找不同的出路了。 </p> <p> <img src="static/picture/20231030113212_16069.jpg" alt="" /> </p> <p> <a href="http://www.szbc888.com" target="_blank"><strong>深圳网站制作</strong></a>的价格的确没有那么低,但是作为一些低价平台上的用户,他们为了争取到客户,低价引流,从而实现了低价格制作网站的形式,作为网站制作公司,你这样低价格去做的目的就只有一个,那就是辛苦转不到钱的,都是转一些辛苦钱而已,面对这样的市场形式和要求,作为网站制作公司一定要不断的提升网站制作的附加值,提升<a href="http://www.szbc888.com" target="_blank"><strong>网站制作</strong></a>的质量,让用户以质量取胜,不能专门走低价格战略,不然你的公司是发展不起来的,也作不大的,作为用户而已,你公司小还可以这样去做,如果公司发展到一定程度的去制作网站,这对于你的公司来说是灭顶之灾了,所以选择网站制作公司还是要从专业的角度出发去帮助客户解决实际的问题,从而实现网站制作公司的价值和效益。 </p>
  • 深圳网站定制开发全流程详解
    <p> 深圳网站定制开发全流程详解,作为网站定制开发公司接下来给大家普及一下网站定制究竟要经过那些过程呢,前期的网站沟通肯定是少不了的,除此之外,网站备案这块也是需要的,只要是正规的公司,正常的流程,网站备案也是需要做的,剩下的就是网站制作过程中的一些沟通了,接下来我们来看看<a href="http://www.szbc888.com" target="_blank"><strong>深圳网站制作</strong></a>公司的一个标准的流程。 </p> <p> 需求分析: 通过对客户业务的了解和与客户对流程的讨论对需求进行基本建模,最终形成需求规格说明书<br /> 总体设计: 通过分析需求信息,对系统的外部条件及内部业务需求进行抽象建模,最终形成概要设计说明文档<br /> 详细设计: 此部分在对需求和概要设计的基础上进行系统的详细设计(也包含部分代码说明)<br /> 开发编程: 对系统进行代码编写<br /> 测试分析与系统整合: 对所有功能模块进行模拟数据测试及其它相关性测试并整合所有模块功能<br /> 现场支持: 系统上线试运行进行现场问题记录、解答<br /> 系统运行支持: 系统正式推产后,对系统进行必要的维护和BUG修改<br /> </p>

Copyright © 2015 深圳市鑫惠广网络科技有限公司 粤ICP备2023111395号