linux 下怎么优化mysql占用内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 下怎么优化mysql占用内存?相关的知识,希望对你有一定的参考价值。

Linux 进程通过 C 标准库中的内存分配函数 malloc 向系统申请内存,但是到真正与内核交互之间,其实还隔了一层,即内存分配管理器(memory allocator)。常见的内存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。mysql 默认使用的是 glibc 的 ptmalloc 作为内存分配器。

内存分配器采用的是内存池的管理方式,处在用户程序层和内核层之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序。

为了保持高效的分配,分配器通常会预先向操作系统申请一块内存,当用户程序申请和释放内存的时候,分配器会将这些内存管理起来,并通过一些算法策略来判断是否将其返回给操作系统。这样做的最大好处就是可以避免用户程序频繁的调用系统来进行内存分配,使用户程序在内存使用上更加高效快捷。

关于 ptmalloc 的内存分配原理,个人也不是非常了解,这里就不班门弄斧了,有兴趣的同学可以去看下华庭的《glibc 内存管理 ptmalloc 源代码分析》【文末链接】。

关于如何选择这三种内存分配器,网上资料大多都是推荐摒弃 glibc 原生的 ptmalloc,而改用 jemalloc 或者 tcmalloc 作为默认分配器。因为 ptmalloc 的主要问题其实是内存浪费、内存碎片、以及加锁导致的性能问题,而 jemalloc 与 tcmalloc 对于内存碎片、多线程处理优化的更好。

目前 jemalloc 应用于 Firefox、FaceBook 等,并且是 MariaDB、Redis、Tengine 默认推荐的内存分配器,而 tcmalloc 则应用于 WebKit、Chrome 等。

参考技术A

修改mysql配置文件,优化缓存大小和连接数连接方式,优化sql语句 ,记得mysql好像是有工具可以查看最占用资源的sql语句,找到他,优化他。

安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。

一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要;一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的参数,有3个配置参数是最重要的,即key_buffer_size,query_cache_size,table_cache。

key_buffer_size只对MyISAM表起作用,

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点 这个数字是远远不够的,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例 key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql,以下的状态值都是本人通过phpmyadmin获得的实例分析:

这个服务器已经运行了20天

key_buffer_size – 128M

key_read_requests – 650759289

key_reads - 79112

比例接近1:8000 健康状况非常好

参考技术B 修改mysql配置文件,优化缓存大小和连接数连接方式,优化sql语句 ,记得mysql好像是有工具可以查看最占用资源的sql语句,找到他,优化他。
安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。

一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要;一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的参数,有3个配置参数是最重要的,即key_buffer_size,query_cache_size,table_cache。

key_buffer_size只对MyISAM表起作用,

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点 这个数字是远远不够的,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例 key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql,以下的状态值都是本人通过phpmyadmin获得的实例分析:

这个服务器已经运行了20天
key_buffer_size – 128M
key_read_requests – 650759289
key_reads - 79112
比例接近1:8000 健康状况非常好

Java程序占用内存太高了怎么办?

自己编的游戏程序,开始之后 10 多个线程一块启动,内存占用从 20,000 升到 300,000,CPU 使用率升到了50%,造成游戏时卡顿严重,求怎么解决。100分

    先看下是否有内存泄露,简单的方法就是隔一段时间检查下内存,看看是否是持续上升。

    然后看下资源是否可以优化,比如你加载的图片有没有resize过,尽可能减少资源的内存消耗。

    游戏卡顿最主要的是FPS帧率太低,把帧率统计输出来看下。检查下UI线程里或者OpenGL线程里是否做了I/O操作,这个是造成卡顿的主要原因。把I/O操作全部放入工作线程中,UI线程只做数据读取和渲染。这样帧率就可以提高了

追问

那个,我是 Java 新手,你说的我看懂了但是具体怎么做?
程序具体表现为点击 Start 按钮后内存瞬间上升 300,000K,但是没有再持续上升。
加载的图片都是用 JLabel.setIcon(icon); 的方式加载,并没有使用绘图工具,所以 resize 的方法该怎么用才好?还有些其他问题被限制字数了。

追答

点击start瞬间上升,那么说明你在点击start之前,初始化该做的没有做完吧,比如图片的加载。你初始化的时候把需要用的资源都先load进来,看看内存有多少,再点击start看看有没有内存暴涨

追问

运行就开始所有线程的话刚打开就是内存 320,000 K ,点击 Start 之后还是那么多。

追答

内存是资源造成的,可以看下图片资源在load进来的时候是不是还可以再把尺寸调小点。卡顿是I/O造成的,你看下UI线程里有没有做耗时的操作

追问

玩家 10*10 像素,AI 一样,子弹 2*2 像素的,只是玩家方向不同图片方向也不一样,AI 没有图片就一蓝色方块,子弹红色的。IO 是什么?

参考技术A 1.线程有无休眠时间
2.休眠时间的时长设置的是否合理。

我猜测你的程序是要不停的运行来实现某种功能。这要休眠时间的设定就显得很重要了。

还有就是你的功能中是否有IO,是否有耗内存的代码块,这些要看具体的才行。单纯是线程的话,注意上面两点就可以了。追问

另外 FPS 我估计也就 2-3 的样子……

参考技术B 这个具体要看代码. java 本身不会占用太多

以上是关于linux 下怎么优化mysql占用内存?的主要内容,如果未能解决你的问题,请参考以下文章

linux 怎么给mysql分配内存大小

Java程序占用内存太高了怎么办?

mysql配置过大内存导致无法启动怎么办 如何解决

linux 下怎么查看一个进程占用内存大小

deepin linux 做了哪些优化?ubuntu12.04开机后内存占用与CPU占用均不低,deepin linux 就很小.这是为啥?

mysql耗内存吗?应该怎么处理?