服务器是32G的,但是经常因为数据库内存达到30G左右然后IIS爆炸。
在网上查了说是更改属性里面的最大服务器内存
我就是想问下:
1.改了最大服务器内存值是否有用。如果sqlserver内存超过了这个值会怎么样2.上面那个选项 “使用AWE分配内存” 是做啥用的,需要勾选吗3.关于数据库内存过高还有没有其他更好的解决办法。
在网上查了说是更改属性里面的最大服务器内存
我就是想问下:
1.改了最大服务器内存值是否有用。如果sqlserver内存超过了这个值会怎么样2.上面那个选项 “使用AWE分配内存” 是做啥用的,需要勾选吗3.关于数据库内存过高还有没有其他更好的解决办法。
-- 有用。一般情况下,如果你改小了,不是太离谱的话, sql server 的内存会逐渐降至你设置的值。
-- 实在不行, 可以在业务不忙的时候, 重启下 sql server 服务一定是能够生效的。2.上面那个选项 “使用AWE分配内存” 是做啥用的,需要勾选吗
-- 那个只是针对老旧的 32 位系统而言的, 你这个应该是 64 位系统, 不需要设置。3.关于数据库内存过高还有没有其他更好的解决办法。
--没有, 也不需要。
--数据库与普通的程序不同, 大内存是天然的优化手段, 如果你的数据库比较大使用又频繁, 基本上有多少内存都会占用完。占用多了, 很多东西都在缓存里, 这样才快。你要做的, 不是怎么想方设法限制数据库的内存, 不是看到内存占用多了就觉得难受, 没必要。
分配好内存就可以了。数据库设置为 25GB
IIS 5GB
操作系统 2GB但最好的解决方案, 还是增加一台 Web 服务器, 让数据库单独用一台服务器。
如果数据库单独用一台服务器, 也不要设置得过高, 总共32GB内存, 限制sqlserver 最大28-30GB。
操作系统不预留一定的空余内存, 有时可能远程都会有问题, 不要因小失大。
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。真不是 bug .
我在 #3 的评论, 你仔细看完, 就会明白: 数据库最好不要跟应用放在一起。
数据库的争夺性非常强, 你没限制的话肯定会挤压 iis 的内存空间。如果数据库的问题, 百度一下就能解决, DBA 就没有必要了。
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。真不是 bug .
我在 #3 的评论, 你仔细看完, 就会明白: 数据库最好不要跟应用放在一起。
数据库的争夺性非常强, 你没限制的话肯定会挤压 iis 的内存空间。如果数据库的问题, 百度一下就能解决, DBA 就没有必要了。好 谢谢 新增服务器是没指望的,我们公司很穷的。。
如果是设置数据库的内存大小就是设置数据库里面最大服务器内存是吧?
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。
挂掉时30G,那么平时你看过吗?是多少呢
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。
挂掉时30G,那么平时你看过吗?是多少呢平时一般维持在28G左右 到30G的时候就不行了。重启的话一般是从几G开始上涨
#3 已经说得很清楚了, 设置为 25GB.
后面可以再根据情况来调整。再送一条语句, 你可以在服务器上执行, 看下 sql 有没有优化的必要:
SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId) AS procName,
DB_NAME(qt.dbId) AS [db_name],
qt.text AS SQL_Full,
SUBSTRING(
qt.text,
(qs.statement_start_offset / 2) + 1,
(
(
CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset
) / 2
) + 1
) AS SQL_Part --统计对应的部分语句
,
qs.creation_time,
qs.last_execution_time,
qs.execution_count,
qs.last_elapsed_time / 1000000 AS lastElapsedSeconds,
qs.last_worker_time / 1000000 AS lastCpuSeconds,
CAST(
qs.total_elapsed_time / 1000000.0 / (
CASE
WHEN qs.execution_count = 0 THEN -1
ELSE qs.execution_count
END
) AS DECIMAL(28, 2)
) AS avgDurationSeconds,
CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS
lastLogicReadsMB,
qs.last_logical_reads,
qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00' --今天8点之后的慢SQL
AND qs.last_elapsed_time >= 3 * 1000 * 1000 --只取执行时间大于 3 秒的记录
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
qs.last_worker_time DESC
也有可能是bug因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。你这个就是把结果当作原因,这不是找故障原因的正确方法。
#3 已经说得很清楚了, 设置为 25GB.
后面可以再根据情况来调整。再送一条语句, 你可以在服务器上执行, 看下 sql 有没有优化的必要:
SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId) AS procName,
DB_NAME(qt.dbId) AS [db_name],
qt.text AS SQL_Full,
SUBSTRING(
qt.text,
(qs.statement_start_offset / 2) + 1,
(
(
CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset
) / 2
) + 1
) AS SQL_Part --统计对应的部分语句
,
qs.creation_time,
qs.last_execution_time,
qs.execution_count,
qs.last_elapsed_time / 1000000 AS lastElapsedSeconds,
qs.last_worker_time / 1000000 AS lastCpuSeconds,
CAST(
qs.total_elapsed_time / 1000000.0 / (
CASE
WHEN qs.execution_count = 0 THEN -1
ELSE qs.execution_count
END
) AS DECIMAL(28, 2)
) AS avgDurationSeconds,
CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS
lastLogicReadsMB,
qs.last_logical_reads,
qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00' --今天8点之后的慢SQL
AND qs.last_elapsed_time >= 3 * 1000 * 1000 --只取执行时间大于 3 秒的记录
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
qs.last_worker_time DESC
我用的sql2005执行不了额,
消息 102,级别 15,状态 1,第 36 行
'.' 附近有语法错误。这一行 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
若剩余得可用内存 小于 最大服务器内存 时,必然会对数据库的运行带来影响,盲目加大 最大服务器内存,只能是弊大于利
其目的是从内存中分割出一块来,专供 SQL Server 使用
及时释放查询资源和关闭数据库,减少(不用)所谓的后台访问,才是减少数据库内存占用的唯一途径
不过,你是如何认定是数据库的原因?
如果是页面程序死锁而导致 网站挂掉 的呢
#3 已经说得很清楚了, 设置为 25GB.
后面可以再根据情况来调整。再送一条语句, 你可以在服务器上执行, 看下 sql 有没有优化的必要:
SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId) AS procName,
DB_NAME(qt.dbId) AS [db_name],
qt.text AS SQL_Full,
SUBSTRING(
qt.text,
(qs.statement_start_offset / 2) + 1,
(
(
CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset
) / 2
) + 1
) AS SQL_Part --统计对应的部分语句
,
qs.creation_time,
qs.last_execution_time,
qs.execution_count,
qs.last_elapsed_time / 1000000 AS lastElapsedSeconds,
qs.last_worker_time / 1000000 AS lastCpuSeconds,
CAST(
qs.total_elapsed_time / 1000000.0 / (
CASE
WHEN qs.execution_count = 0 THEN -1
ELSE qs.execution_count
END
) AS DECIMAL(28, 2)
) AS avgDurationSeconds,
CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS
lastLogicReadsMB,
qs.last_logical_reads,
qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00' --今天8点之后的慢SQL
AND qs.last_elapsed_time >= 3 * 1000 * 1000 --只取执行时间大于 3 秒的记录
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
qs.last_worker_time DESC
我用的sql2005执行不了额,
消息 102,级别 15,状态 1,第 36 行
'.' 附近有语法错误。这一行 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
其实在 sqlserver2005 下是可以执行的, 但需要把兼容性级别改成 2005 , 如果兼容性级别是 2000 , 就会出现你那样的错误。数据库的优化, 其实是需要比较专业的知识。
下次有类似的问题, 欢迎到 SQL Server 版块。超时比较麻烦, 最好能在应用程序的日志中记载。
如果有数据库异常(不管是什么原因导致的异常), 都记录下相关的 SQL 语句和存储过程名, 还有所有的参数值。
这样, 即使有异常, 也能非常精准的一步到位定位问题。定位了问题, 下一步的优化才有目标。但限制 SQL Server 内存, 不管怎么样都是要做的, 这个无需置疑, 做了再说吧。
这个谈不上优化, 但至少可以减少 IIS 崩溃。如果你司有专门 的运维人员, 让他们对这台机做监控, 比如服务器异常了, 提供崩溃时的 cpu, 内存情况。
理论虽然重要, 但空谈理论不行, 需要有实际的数据来支撑。
这首先要检查你的 and_user.cs 的110 行之类的代码。不要纠结什么数据库,那只是结果,根本不是原因。如果你纠结于结果等于绕弯弯在乱猜原因!
去检查出错的语句、日志记录出错的环境(输入变量值)。在你电脑上重现 bug。你可以想想看,不重现 bug,而是把时间花在与运行时明显的 bug 无关的地方,不可能解决 bug。
{
this.Command
}, endTime: new DateTime(2018, 9, 30, 20, 0, 0));
#if DEBUG
return Search(query);
#else
try
{
return Search(query);
}
catch (Exception ex)
{
Common.Program.WriteObjectLog("law详细查询", new
{
query,
error = ex.ToString()
});
throw;
}
#endif这里首先使用条件编译语句,区分 BEBUG 和 Release,在 DEBUG 中根本不去 try...catch。然后在 Release 的时候,在特定的日志文件中,记录了参数 query 和 异常堆栈信息。当出现错误的时候,你需要贴出特定的日志文件,查看当时的变量值和异常堆栈。如果贴不出来错误日志,那就不算是能够 debug。这就好像一个庸医不首先拿到诊断书,而是只能乱猜乱想什么以学书本上的教条。