发表于: 2018-03-14 23:00:39
1 549
今日完成:
1. Tomcat端口
8005端口是用来关闭TOMCAT服务的端口。
Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
2. centos性能监控和优化
使用nginx进行负载均衡,打开一个resin和tomcat,使用jmeter压测,刚开始相应速度挺好,测试4、5轮后响应速度相当慢,使用xshell链接服务器后,操作速度也特别慢
1) uptime 查看服务器运行时间和用户登陆数,load average负荷情况
负荷并不高
2) dmesg 显示内核信息,有效诊断机器硬件故障或者添加硬件出现的问题
看不懂,因为是云服务器,暂且不考虑硬件问题
3) top 查看系统当前运行情况
因为期间尝试压测,所以load average负荷情况不理想了
可以发现内存占用特别高,应该是因为这个问题导致服务器响应变慢
- <Space>:立即刷新
- s:设置刷新时间间隔
- c:显示命令完全模式
- t::显示或隐藏进程和CPU状态信息
- m:显示或隐藏内存状态信息
- l:显示或隐藏uptime信息
- f:增加或减少进程显示标志
- S:累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+
- P:按%CPU使用率排行 shift+p
- T:按MITE+排行 shift+t
- M:按%MEM排行 shift+m
- u:指定显示用户进程
- r:修改进程renice值
- k kill:进程
- i:只显示正在运行的进程
- W:保存对top的设置到文件^/.toprc,下次启动将自动调用toprc文件的设置。
- h:帮助命令。
- q:退出
按m,查看内存使用比例-------使用了98.8%
shift+m 按内存使用排序
可以猜测tomcat,resin,mysqld占用大量内存
4) 使用ps –ef|grep 查看tomcat和resin 的PID
确定原因在于这两个软件占用内存太高
所以kill掉一个就好了,但是为什么刚开始测试的时候没出现这个问题,而且mysql占用的内存是不是有点高?
先把占用内存最高的resin先kill掉,内存占用立即下降
系统响应速度和压测数据恢复正常
5) vmstat
vmstat提供了processes, memory, paging, block I/O, traps和CPU的活动状况
6) iostat iotop
3. 线程进程都会有自己的ID,这个ID就叫做PID,PID是不特指进程ID,线程ID也可以叫做PID。
创建一个新的进程会给一个新的PID和TGID,并且2个值相同,
当创建一个新的线程的时候,会给你一个新的PID,并且TGID和之前开始的进程一致。
4. memcached服务端常用命令
https://www.cnblogs.com/wayne173/p/5652034.html
5. 本地安装redis
chocolatey是windows下的一个命令行的包管理工具,类似ubuntu的apt,或centos下的yum
以管理员权限在cmd中运行
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString
('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
安装chocolatey:
安装redis
更新redis
启动redis
将redis添加到服务中
常用的redis服务命令。
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
redis默认端口6379
Redis会定时 保存数据到硬盘上
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
6. redis+maven
<!--redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
public class JedisUtil {
JedisPool pool;
Jedis jedis;
@Before
public void setUp() {
pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1");
jedis = pool.getResource();
}
@Test
public void testGet() {
System.out.println(jedis.get("name"));
}
@Test
public void testBasicString() {
// 添加数据
jedis.set("name", "minxr");
System.out.println(jedis.get("name"));
// 在原来数据后面添加数据
jedis.append("name", "jarorwar");
System.out.println(jedis.get("name"));//执行结果:minxrjarorwar
// 覆盖数据
jedis.set("name", "wuyiqiang");
System.out.println("name");
// 删除
jedis.del("name");
System.out.println(jedis.get("name"));
// 存入多个
jedis.mset("name", "minxr", "jarorwar", "hahahah");
System.out.println(jedis.get("name"));
System.out.println(jedis.mget("name", "jarorwar"));
}
@Test
public void testMap() {
Map<String, String> user = new HashMap<String, String>();
user.put("name", "minxr");
user.put("pwd", "password");
jedis.hmset("user", user);
// key中key
List<String> rsamp = jedis.hmget("user", "name");
String hah = jedis.hmget("user", "name").getClass().toString();
System.out.println(hah);
System.out.println(rsamp);
System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数1
System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true
System.out.println(jedis.hkeys("user"));//返回map对象中的所有key [pwd, name]
System.out.println(jedis.hvals("user"));//返回map对象中的所有value [minxr, password]
Iterator<String> iter = jedis.hkeys("user").iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + jedis.hmget("user", key));
}
}
@Test
public void testList() {
jedis.del("list");
System.out.println(jedis.lrange("list", 0, -1));
jedis.lpush("list", "spring");
jedis.lpush("list", "struts");
jedis.lpush("list", "hibernate");
// -1表示取出全部
System.out.println(jedis.lrange("list", 0, -1));
}
@Test
public void testSet() {
//添加 集合
jedis.sadd("sname", "minxr");
jedis.sadd("sname", "jarorwar");
jedis.sadd("sname", "hehe");
jedis.sadd("sanme", "noname");
//移除noname
jedis.srem("sname", "noname");
System.out.println(jedis.smembers("sname"));//获取所有加入的value
System.out.println(jedis.sismember("sname", "minxr"));//判断 minxr 是否是sname集合的元素
System.out.println(jedis.srandmember("sname"));//返回一个随机值
System.out.println(jedis.scard("sname"));//返回集合的元素个数
}
@Test
public void test() throws InterruptedException {
//keys中传入的可以用通配符
System.out.println(jedis.keys("*")); //返回当前库中所有的key [sose, sanme, name, jarorwar, foo, sname, java framework, user, braand]
System.out.println(jedis.keys("*name"));//返回的sname [sname, name]
System.out.println(jedis.del("sanmdde"));//删除key为sanmdde的对象 删除成功返回1 删除失败(或者不存在)返回 0
System.out.println(jedis.ttl("sname"));//返回给定key的有效时间,如果是-1则表示永远有效
jedis.setex("timekey", 10, "min");//通过此方法,可以指定key的存活(有效时间) 时间为秒
Thread.sleep(5000);//睡眠5秒后,剩余时间将为<=5
System.out.println(jedis.ttl("timekey")); //输出结果为5
jedis.setex("timekey", 1, "min"); //设为1后,下面再看剩余时间就是1了
System.out.println(jedis.ttl("timekey")); //输出结果为1
System.out.println(jedis.exists("key"));//检查key是否存在
System.out.println(jedis.rename("timekey","time"));
System.out.println(jedis.get("timekey"));//因为移除,返回为null
System.out.println(jedis.get("time")); //因为将timekey 重命名为time 所以可以取得值 min
//jedis 排序
//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
jedis.del("a");//先清除数据,再加入数据进行测试
jedis.rpush("a", "1");
jedis.lpush("a", "6");
jedis.lpush("a", "3");
jedis.lpush("a", "9");
System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1]
System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //输入排序后结果
System.out.println(jedis.lrange("a", 0, -1));
}
}
明日计划:
1. redis+aop并进行压测
2. 整理任务6知识点
遇到的问题:
1. 启用连接池的前提条件是保证数据之间的独立性或者数据更新的同步,对同一个节点的各个连接之间是没有做更新同步的,因此应用需要保证数据之间是相互独立的或者全部采用CAS更新来保证原子性。
2. jsp页面从什么方向进行优化,有什么思路步骤吗,提高相应速度?
收获:
1. 在服务器查看系统运行状况,分析系统性能及优化方向
2. 初步学习redis并进行尝试
评论