软件维护的重要性
2020年春节与以往的有明显不同,让中国互联网人迎来了一场技术大考验──超过1000万的组织和2亿的上班族在线开工、5000万的学生在线学习。由于在线数据在此期间保持了持续不断的、十倍甚至几十倍的业务容量增长,导致服务器崩溃、出现Bug,或者网络无法接入、卡顿等状况。问题的关键主要是卡在了数据库。一般系统慢都是慢在后端,而后端主要慢在与数据库的交互。那么,数据库到底出现了什么问题呢?
(1)数据库中的表空间不足
Oracle数据库使用表空间来管理表,MySQL直接把表保存在数据文件中,无论哪种方式,数据库服务器的磁盘空间都是有限的,都会存在磁盘空间不够的情况,一旦Web网站的数据库磁盘空间不足,就会导致平台前端没有响应或者数据操作失败的情况。
(2)数据库临时表数量不够用
许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,直到有临时表被释放时才能再继续进行查询。这是一个不容易被程序员发觉的问题,但会在负载测试时显露出来。
(3)磁盘空间用尽了
导致系统无法正常运行的最可能的原因是磁盘已满。日志文件会很快用光所有的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。日志文件系统空间已满时Web服务器也会被挂起,尽管机器自身被挂起的概率已大大减低。
(4)进程缺乏文件描述符
文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,这意味着每个从shell启动的进程可以同时打开64个文件和网络连接。大多数shell都有一个内嵌的ulimit命令可以增加文件描述符的数目。如果已为一台Web服务器或其他关键进程分配了文件描述符,但它却需要更多的文件描述符,则服务器或进程会被挂起或报错,直至得到了所需的文件描述符为止。
(5)线程死锁
由多线程带来的性能改善是以可靠性为代价的,主要是因为这样有可能产生线程死锁。线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。假设这种情况一直持续下去,就会发生死锁现象。如果程序使用了永久锁,比如锁文件,而且程序结束时没有解除锁状态,则其他进程可能无法使用这种类型的锁,既不能上锁,也不能解除锁。这会进一步导致系统紊乱,无法正常工作。
除前述问题外,数据库还存在诸如性能问题、安全问题、可靠性问题、数据备份问题、结构设计问题等,这些问题都会影响系统性能。此外数据库的物理设计、与前端的交互方式、自身的参数设置、索引的设计以及维护方案等也都会对系统性能产生影响。
所以,运维人员必须重视数据库,很多时候只是在数据库上做一些常规的配置或简单的优化,就能让系统性能有几倍甚至几十倍的提升。