Tuesday, December 28, 2010

使用subprocess.Popen,程序block问题处理

使用subprocess.Popen,程序block问题处理

问题:

 脚本运行中,执行sudo strace svnadmin,出现卡死现象,一直保持如下信息不动:

 getcwd("/home/ysl/svn-repo-bak"..., 4098) = 28

 write(2, "* Dumped revision 2769.\n", 24

分析:

jessinio: jobs有什么呢

: 没东西

jessinio: 终端是不是和你运行SvnDumpBak.py是同一个?

: 不是,我又另外打开了一个

jessinio: 呃。。。车子不同, 你查个刹车 没有意义

: 那我要在执行命令那里,ctrl z掉,让它在后台跑?

jessinio: ctrl z 然后bg

: [ysl@svn-repo-bak]$ bg

[1]+ sudo python SvnDumpBak.py yslProR &

[[ysl@svn-repo-bak]]$ jobs

[1]+ Running sudo python SvnDumpBak.py yslProR &

 

jessinio: ps auxwww|grep strace

: [[ysl@svn-repo-bak]]$ ps auxwww|grep strace

ysl 10851 0.0 0.0 61144 728 pts/0 S+ 14:45 0:00 grep strace

root 31108 2.2 0.0 4112 632 pts/1 S+ 14:31 0:17 strace -p 17686

jessinio: 还有一个strace

: 我打另一个连接,在跑strace来看,刚还有信息在更新。现就卡着了

jessinio: 你把strace停了

: ctrl c??

: 停了

 

jessinio: ps auxwww|grep 7z

: root 17687 85.5 4.9 233772 199576 pts/0 Sl 14:15 27:37 /usr/local/p7zip_9.13/bin/7z a -si /data/backup/svnRepo//20101227/yslProR.full20101227.dump -pNBc5RB!

jessinio: strace -p 17687

: [[ysl@svn-repo-bak]]$ sudo strace -p 17687

Process 17687 attached - interrupt to quit

[ Process PID=17687 runs in 32 bit mode. ]

futex(0x86b54ac, FUTEX_WAIT_PRIVATE, 1366961, NULL

jessinio: top -p 17687

: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

17687 root 15 0 228m 194m 1856 S 0.0 4.9 27:37.96 7z

jessinio: 变化 不?

: TIME+下的数据没变啊

jessinio: 还是没有变?

: 没,还是 27:37.96

jessinio: ps auxwww|grep svnadmin

: root 17686 2.4 2.5 205868 103152 pts/0 S 14:15 1:10 svnadmin dump /storage/repool/yslProR -r 0:4855

jessinio: 你的代码应该有问题。

: 可是小的仓库为什么没问题呢

jessinio: buffer没有满呀

结论:

    同事帮忙分析是由于buffer满导致,检查了程序,原版:

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    p.wait()

    # command exec error,print detail info

    if p.returncode:     

        write_log(p.stdout.read())

    return p.returncode

    也就是说没有处理输出数据,而pipe容量有限的。如果满了将会block或者fail。信息如下:

Pipe Capacity

      A pipe has a limited capacity.  If the pipe is full, then a write(2) will block or fail, depending on whether the  O_NONBLOCK

      flag  is  set  (see  below).

解决:调整脚本,增加了一个变量来读取PIPE里的输出数据

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    retval = p.stdout.read()

    p.wait()

    # command exec error,print detail info

    if p.returncode:     

        write_log(retval)

    return p.returncode

资料:   

    subprocess模块:http://docs.python.org/library/subprocess.html


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

svnadmin dump | 7z命令执行失败

svnadmin dump | 7z命令执行失败

问题:

7-Zip 9.13 beta  Copyright (c) 1999-2010 Igor Pavlov  2010-04-15

p7zip Version 9.13 (locale=C,Utf16=off,HugeFiles=on,2 CPUs)

Compressing  [Content]

System error:

Operation not permitted

svnadmin: Can't write to stream: Broken pipe

疑问:为什么小仓库dump,7z压缩正常,而大的仓库就会报类似以上的错误?

分析:

1. 执行mount,获取分区信息

2. 执行df -h,获取硬盘大小信息

3. 检查引发错误的的执行命令行是否有问题

svnadmin dump /storage/yslProR -r 0:1000 | /usr/local/p7zip_9.13/bin/7z a -si /data/space/svndumpbak/20101229/yslProR.full20101229.dump -p2048密码

结论:

   1.问题是由于空间不足引发的,其中/data目录的空间占用100%,信息如下:

     /dev/mapper/VolGroupData-LogVolData   10G   10G   74M 100% /data

   2.而引发空间不足,又是由于/data/space的空间没mount成功导致的。

解决:

    1.重新mount备份存储空间

      mount -t nfs 192.168.5.5:/data/space/ /data/space/

    2.为避免机子重启,mount空间失效,则请将以上mount命令加入/etc/rc.local


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Linux下scp密钥问题

需求A机往Bscp操作

事件:要求运维的系统管理员给配个密钥,把公钥分配给B机。原以为他把公钥让我扔给B机的主人,而私钥他会配好,结果啥也没做, 啥也没配,也没说。结果,我杯剧:

情景

SSHA机,scp数据时出现如下错误:

Permission denied (publickey,gssapi-with-mic).

lost connection

咨询了一下,私钥放在哪。答案:本地(A)没放。好吧,我认,自个动手把私钥cpA机的某目录下如/home/ysl/cfg/ysl_key,并更改文件的权限:chmod 0600 /home/ysl/cfg/ysl_key

继续试着执行scp操作:

scp -r /data/tempdir/20101025 -i /home/ysl/cfg/ysl_key ysl@5.5.5.5:/data/ysldata

结果错误信息仍然存在。

那么,试着SSH一下:

ssh -i /home/ysl/cfg/ysl_key ysl@5.5.5.5: "ls -ld /data/ysldata"

很好,有正常信息出现,那为什么scp不行??

试着在scp时打印出相关日志,执行:

scp -vvv /data/tempdir/20101025/file -i /home/ysl/cfg/ysl_key ysl@5.5.5.5:/data/ysldata

日志中发现-i指定私钥不被识别,只会在当前账号的根目录去找/home/ysl/.ssh/id_rsa

继续试着执行cp /home/ysl/cfg/ysl_key /home/ysl/.ssh/id_rsa

然后重新scp操作,发现正常了。

结论

据同事给出scp的手册中说明-i identity_file的信息:

Selects the file from which the identity (private key) for RSA authentication is read. This option is directly passed to ssh(1).

相当于说-i是指定使用RSA的私钥。上面用到的私钥/home/ysl/cfg/ysl_key并不是RSA格式的,因此无效。

解决

1. 更找密钥,生成RSA格式的

2. 以某个要执行scp动作的账号按以下步骤操作(elian)

mkdir /elian/.ssh

chmod 0700 /elian/.ssh

cp /home/ysl/cfg/ysl_key /elian/.ssh/id_dsa

chown -R root:root /elian/.ssh

chmod 0600 /elian/.ssh/id_dsa



--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Tuesday, December 21, 2010

SVN命令行:error while loading shared libraries

错误类似信息:

svnlook: error while loading shared libraries: libsvn_repos-1.so.0: cannot open shared object file: No such file or directory

 

以下是本人在执行脚本报如上错误时,查找原因的步骤信息

1.执行ldd $(which svnlook),获取含有so.0:文件的信息(文件存在,为何还报错呢?)

libsvn_repos-1.so.0 => /usr/local/lib/libsvn_repos-1.so.0 (0x00002b0260dd2000)

2. 接着试单独执行svnlook ......,结果是正常使用的;

3. 继续执行了whereis svnlook ,得出以下两个路径:

usr/bin/svnlook usr/bin/local/svnlook

4. 紧接,试着单独执行usr/bin/svnlook,结果报了一样的错误(注:脚本带有/usr/bin/env,因此脚本运行时也是使用这路径的命令)

5. 执行ldd /usr/bin/svnlook,需要的文件真的是找不到 

libsvn_repos-1.so.0 => not found

libsvn_fs-1.so.0 => not found

libsvn_fs_fs-1.so.0 => not found

libsvn_fs_base-1.so.0 => not found

libsvn_delta-1.so.0 => not found

libsvn_diff-1.so.0 => not found

libsvn_subr-1.so.0 => not found

 

结论usr/bin/svnlook该路径的命令有问题

处理:

a.安全起见,备份下原来的

mv /usr/bin/svnlook /usr/bin/svnlook_back

b.重新ln一份正常的

ln -s /usr/local/bin/svnlook /usr/bin/svnlook


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Py脚本莫名的问题莫名的解决

脚本在执行时,突然报如下错误(声明:在十分几分钟前运行是正常的):

  File "/home/yusulian/ysltest/mail.py", line 6, in <module>

    import smtplib

  File "/usr/local/lib/python2.5/smtplib.py", line 49, in <module>

    from email.base64MIME import encode as encode_base64

ImportError: cannot import name encode

 疑惑:有点莫名其妙,没变动python的环境。

 结果:实在是没有头绪,直接跑到运行的工作目录,把相关*.pyc文件给删出,然后在重新运行一下,竟然正常了。


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Linux/win下共用正则表达式,获取干净的md5值

linuxwin下执行完md5命令后,各自返回的信息格式有出入,作下记录:

[yusulian@wol-svn-svr0 ysltest]$ md5sum /data/backup/20101217/dop.full20101217.dump

b5952f4f489e9db46115425f01408343  /data/backup/20101217/dop.full20101217.dump

 

E:\WorkDir\yusulian\>D:\soft\too\md5\md5sum.exe E:\WorkDir\temp\svndump\20101217\R0.full20101217.dump

\98b8f16be45b07e64b1dceff19b6a3aa *E:\\WorkDir\\temp\\svndump\\20101217\\R0.full20101217.dump

 

给出共用的正则表达式,获取干净的md5值:

regStr = r"(\\|)(.*)(  | \*)(.*)"

md5Value = re.match(regStr, md5Result).group(2)

return md5Value


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Wednesday, November 24, 2010

[转]tomcat内存溢出总结

转载下别人对方面的总结,比较清晰
http://developer.51cto.com/art/200908/144653.htm

在生产环境中tomcat内存设置不好很容易出现内存溢出。本文分析了三种造成Tomcat内存溢出的原因,并分别进行了分析。
Tomcat内存溢出的原因

在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。

这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

1.OutOfMemoryError: Java heap space

2.OutOfMemoryError: PermGen space

3.OutOfMemoryError: unable to create new native thread.

Tomcat内存溢出解决方案

对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize  -XX:MaxPermSize)

最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

-Xms:初始堆大小

-Xmx:最大堆大小

但堆的大小受下面三方面影响:

1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试 1612M,64为操作系统对内存无限制。)

2.系统的可用虚拟内存限制;

3.系统的可用物理内存限制。

堆的大小可以使用 java -Xmx***M  version 命令来测试。支持的话会出现jdk的版本号,不支持会报错。

-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m

第二种:永久保存区域溢出

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。http://www.javaeye.com/topic/80620?page=1 的帖子有讨论的这个问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,导致内存溢出。

这一个一般是加大-XX:PermSize  -XX:MaxPermSize 来解决问题。

-XX:PermSize 永久保存区域初始大小

-XX:PermSize 永久保存区域初始最大值

这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m  -XX:PermSize=128M -XX:PermSize=256M

有一点需要注意:java -Xmx***M  version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的 和 比如系统支持最大的jvm堆大小事1.5G,那  -Xmx1024m  -XX:PermSize=768M 是无法运行的。

第三种:无法创建新的线程。

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。

这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。

产生这种现象的原因如下(从这个blog中了解到原因:http://hi.baidu.com/hexiong/blog ... b10c2542a75b3c.html):

每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

对于jdk1.5而言,假设操作系统保留120M内存:

1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads

1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

在2000/XP/2003的boot.ini里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。

因此这种情况需要结合操作系统进行相关调整。

因此:我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题。

以上就是针对Tomcat内存溢出的几种解决方案。本文来自George的博客:《tomcat内存溢出总结》


--
Elian
 
Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Wednesday, November 17, 2010

win2008不能访问共享

win2008在访问共享时:
1.出现"发生系统错误53,找不到网络路径"的错误.
有点奈闷了,另一台机子访问好好的..
后面突然想到可能在配置网络时有的区别.
试着打开本地连接属性对话框,并将"Microsoft 网络客户端"勾选恢复,此问题解决.

2.出现"无任何网络提供程序接受指定的网络路径。"的错误
a.服务停止:一般有workstation,server,computer browser这三个服务,检查是否停止,设为自动然后启动即可。
b.网络连接属性中的“Microsoft 网络的文件和打印机共享”需选中。


--
Elian

Configuration Manage Engineer
MSN: smallfish961@hotmail.com
Email: smallfish382+work@gmail.com

Thursday, October 21, 2010

[转]TOMCAT内存大小调整

一、tomcat内存设置问题

   在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat、jboss,weblogic)加载jar包时会出现java.lang.OutOfMemoryError异常。这主要是由于应用服务器的内存不足引起的。这种异常常有以下几种情况(以下以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理):
   1.  java.lang.OutOfMemoryError: PermGen space
       PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域OutOfMemoryError: PermGenspace。从文字上看就是内存溢出,解决方法是加大内存。为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGenspace区域,它和存放Instance的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGenspace错误。这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
       解决方法: 手动设置MaxPermSize大小
       a.如果tomcat是以bat方式启动的,则如下设置:
       修改TOMCAT_HOME/bin/catalina.sh
       在"echo "UsingCATALINA_BASE:   $CATALINA_BASE""上面加入以下行:
       JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
       b.如果tomcat是注册成了windows服务,以services方式启动的,则需要修改注册表中的相应键值。
           打开注册表,找到目录HKEY_LOCAL_MACHINE\SOFTWARE\Apache SoftwareFoundation\Procrun2.0\htfty\Parameters\Java,其中目录地址中红色标注的(如htfty)需要根据不同情况作修改,为tomcat服务注册成windows服务的名称。可以看到JvmMs和JvmMx项,其中JvmMs设置最小的内存使用参数,JvmMx设置最大的内存使用参数。设置好JvmMs和JvmMx项的值,重启tomcat服务器即可生效。
   建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
    2.  java.lang.OutOfMemoryError: Java heapspace
          JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。JVM在启动的时候会自动设置Heapsize的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn-Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和TenuredGeneraion 之和。在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
   解决方法:手动设置Heap size
   a.如果tomcat是以bat方式启动的,则如下设置:
   修改TOMCAT_HOME/bin/catalina.sh
    在"echo"UsingCATALINA_BASE:   $CATALINA_BASE""上面加入以下行:
   JAVA_OPTS="-server -Xms800m-Xmx800m   -XX:MaxNewSize=256m"
   b.如果tomcat是注册成了windows服务,以services方式启动的,则需要修改注册表中的相应键值。
           打开注册表,找到目录HKEY_LOCAL_MACHINE\SOFTWARE\Apache SoftwareFoundation\Procrun2.0\htfty\Parameters\Java,其中目录地址中红色标注的(如htfty)需要根据不同情况作修改,为tomcat服务注册成windows服务的名称。可以看到JvmMs和JvmMx项,其中JvmMs设置最小的内存使用参数,JvmMx设置最大的内存使用参数。设置好JvmMs和JvmMx项的值,重启tomcat服务器即可生效。
提示:Heap Size最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

二、Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms-Xmx来调整应用程序的初始内存和最大内存:这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。
    Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。有以下几种方法可以选用:
第一种方法:
Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB。
第二种方法:环境变量中设    变量名:JAVA_OPTS    变量值:-Xms512m   -Xmx512m
第三种方法:前两种方法针对的是bin目录下有catalina.bat的情况(比如直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法:

 

打开tomcatHome/\bin/\tomcat5w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initialmemory pool和Maximum memory pool.Initial memorypool这个就是初始化设置的内存的大小。Maximum memorypool这个是最大内存的大小设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了
另外需要考虑的是Java提供的垃圾回收机制。

虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。   如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的,最低值加大,最高值可以随便设,但是要根据实际的物理内存,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/coolwzjcool/archive/2008/06/13/2544448.aspx

Wednesday, October 13, 2010

mysql连接,访问拒绝

错误信息:Access denied for user 'kscm'@WIN-WP4X5EPPTIO'(useing password:YES)

情景A:
  1. 明明本机上的客户端可以正常连接数据库,但程序部署起来还是报错.
  2. 明明本机的电脑名称WIN-WP4X5EPPTIO已改名了,也重启了电脑,但是连接时还是显示旧的信息..

解答A:
  1. 程序部署连接数据库的账号信息有误
  2. 在my.ini文件中找到[mysqld],在此段的配置信息中添加skip-name-resolve,这样客户端请求连接时就会用IP地址了.


情景B:

用新创建的用户执行一些SQL脚本(仓库新数据库及表),但执行失效,反应过来估计权限不够,应该用root账号.

然后重新想用root账号连接,却怎么也连不上去了.前几分钟还连过一次,现怎么不行了.
解答B:
原以为是像上次出现密码有问题??因此按照以下步骤进行了密码更新:
  1. 首先,在my.ini文件中的[mysqld]段配置信息内加上skip-grant-tables
  2. 重启mysql服务
  3. 来到mysql安装目录下的bin,打开cmd,执行mysql -u root,这时候要你输入密码,回车即可
  4. 在mysql>环境下执行以下几条命令:

mysql>use mysql;

mysql>UPDATE user SET password=PASSWORD("5688") WHERE user='root';

mysql>FLUSH PRIVILEGES;


结果,重新登录仍然无效.
同事说,其实密码是已经改了,大部分跟授权有关.
因此,他按照以下步骤进行了处理:
  1. 首先,在my.ini文件中的[mysqld]段配置信息内加上skip-grant-tables
  2. 重启mysql服务
  3. 来到mysql安装目录下的bin,打开cmd,执行mysql -u root,这时候要你输入密码,回车即可
  4. 在mysql>环境下执行以下命令,目的是让111.111.111.158机子可以用root账号登录

mysql>use mysql;
mysql>update user set host = '111.111.111.158' where user = 'root';
  1. 利用111.111.111.158机子的客户端,竟然可以正常连接.且继续执行以下命令,目的是让本机可以连接

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'111.111.111.160' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';
  1. 结果无效,不死心的参考资料继续执行:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD'*00A51F3F48415C7D4E8908980D443C29C69B60C9';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'dubabuild' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';
  1. 回到本机,执行以下命令行,都一样报"Access denied"的错误信息

mysql -u root -h 10.20.239.160
mysql -u root -h 127.0.0.1
mysql -u root -h localhost
  1. 继续在网络上查找解决的方法,看到一则信息后改变了连接方式即执行mysql -u root -p,

这里候要求你输入密码,直接输入新密码,登录成功.
  1. 回到mysql administrator工具,利用root账号采用新的密码,一样登录成功了.
  2. 然后,利用mysql admini工具,保留%/localhost的授权连接,退出再重新登录正常了.


总结:如果出现类似这样的问题,一检查账号密码是否有误,二检查援权问题.

重装mysql,服务启动不了

问题现象:
---------------------------
Services
---------------------------
Windows could not start the MySQL service on Local Computer.
Error 1067: The process terminated unexpectedly.
---------------------------
OK
---------------------------
问题解答:
在my.ini中找到datadir="E:/mysql_data/Data/",然后将在此目录下的数据删除