作者归档:aigol

关于aigol

Hi boby

CentOS增加新硬盘

环境:
在正常运行CentOS 7.1的机器上添加一块80G的新硬盘.

系统:

# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 

# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

步骤:
1、关机、加硬盘、开机
2、查看硬盘是否识别到

# fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes, 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xf0b1ebb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        4096   209723391   104859648    7  HPFS/NTFS/exFAT
/dev/sda2       209723392   210747391      512000   83  Linux
/dev/sda3       210747392   976773119   383012864   8e  Linux LVM

Disk /dev/sdb: 80.0 GB, 80026361856 bytes, 156301488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x947748e0

3、fdisk /dev/sdb 硬盘分区

 

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): m  #帮助
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): p  #查看分区

Disk /dev/sdb: 80.0 GB, 80026361856 bytes, 156301488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x947748e0

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n   #新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p    #主分区
Partition number (1-4, default 1): 1    #分区个数
First sector (2048-156301487, default 2048):     #使用所有,直接回车
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-156301487, default 156301487): #直接回车
Using default value 156301487
Partition 1 of type Linux and of size 74.5 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

4、查看分区是否成功

# ll /dev/sdb*
brw-rw----. 1 root disk 8, 16 Apr 15 22:11 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 15 22:11 /dev/sdb1

5、格式化分区

# mkfs    #系统支持的文件系统格式
mkfs         mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs 

# mkfs.xfs /dev/sdb1   #CentOS7.1 默认的文件系统为xfs,保存同系统一致

6、挂载新硬盘,并添加到 /etc/fstab自动挂载

mkdir /newdisk
mount /dev/sdb1 /newdisk

# vi /etc/fstab 

# /etc/fstab
# Created by anaconda on Wed Apr 15 18:50:24 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/sdb1               /newdisk            xfs     defaults        0 0

7、重启验证一下

# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        50G  1.1G   49G   3% /
devtmpfs                devtmpfs  927M     0  927M   0% /dev
tmpfs                   tmpfs     937M     0  937M   0% /dev/shm
tmpfs                   tmpfs     937M  8.5M  928M   1% /run
tmpfs                   tmpfs     937M     0  937M   0% /sys/fs/cgroup
/dev/sdb1               xfs        75G   33M   75G   1% /newdisk
/dev/mapper/centos-home xfs       312G   33M  312G   1% /home
/dev/sda2               xfs       497M  121M  377M  25% /boot

参考文档:
http://www.linuxidc.com/Linux/2011-02/31868.htm

nslookup、dig 命令

命令安装:

查询命令对应的安装包:

yum provides */nslookup
yum provides */dig

安装:
yum install bind-utils

dig

dig @223.5.5.5 www.baidu.com   #使用223.5.5.5作为dns服务器,解析www.baidu.com
dig @223.5.5.5 www.baidu.com -t AAAA  #使用223.5.5.5作为dns服务器,
                                      #解析www.baidu.com  AAAA记录
dig @223.5.5.5 baidu.com -t MX
dig @223.5.5.5 baidu.com -6
dig @223.5.5.5 www.baidu.com -6
dig -x 180.97.33.107      
dig +tcp www.baidu.com        #使用TCP-53,解析www.baidu.com
dig @223.5.5.5 +trace www.baidu.com     #跟踪解析过程

 

参考:
http://roclinux.cn/?p=2449

重置CentOS/RHEL 7中遗忘的根用户帐户密码

转自:http://netsecurity.51cto.com/art/201504/470540_all.htm

你有没有遇到过这种情况:想不起来Linux系统上的用户帐户密码?要是你忘了根用户密码,情况就更为糟糕。你无法执行任何面向整个系统的变更。要是你忘了用户密码,很容易使用根帐户来重置密码。

可要是你忘了根帐户密码,那该如何是好?你无法使用用户帐户来重置根帐户密码,因为用户帐户通常无权执行这种任务。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

重置CentOS 7和RHEL 7中遗忘的根用户帐户密码

万一你遇到了这种情况,这篇指南文章可以帮助你摆脱此类困境。本文将介绍如何重置RHEL 7和CentOS 7根帐户密码。

今天一大早,我打开了RHEL 7 Linux服务器,结果却发现它被锁住了。不是我搞砸了前一晚更改的密码,就是确确实实忘了密码。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

遗忘的根帐户密码

那么,我现在该如何是好?我应该使用用户帐户登录,试着更改根帐户密码吗?

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

只有根用户才能设置密码

糟糕的是,我看到的信息是“Only root can specify a user name”(“只有根帐户才能指定用户名称”),我对根帐户失去了控制权。于是我打算引导进入到单一用户模式。为此,重启服务器;一旦你看到下列屏幕,就按键盘上的“e”(代表编辑)。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

按“e”进入编辑引导菜单

在你按了键盘上的“e”后,你会看到许多文本,文本内容会根据屏幕尺寸来缩短。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

Grub配置

搜寻文本“rhgb quiet”,将它换成“init=/bin/bash”,不要引号。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

启用外壳

一旦完成了编辑,按“ctrl+x”组合键,它会开始以指定的参数来引导。你会获得bash提示符。

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

引导系统

现在,在单一用户模式上运行下列命令,检查根分区的状态。

# mount | grep root

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

检查根分区挂载状态

你可能注意到,根分区被报告为“ro”(只读)。我们需要对根分区拥有读写权限,才能更改根帐户密码。

# mount -o remount,rw /

另外反复检查一下,看看根分配是否以读写权限模式来挂载。

# mount | grep root

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

对根分区设置权限

现在你可以更改根帐户密码了,只要键入passwd命令。但这还没完。我们需要重新标记SELinux上下文。如果我们跳过重新标记整个SELinux上下文这一步,就能够使用using password来登录了。

# passwd root
[输入新密码]
[重新输入新密码]
# touch /.autorelabel

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

重置根帐户密码

重启,再次登录进入到根帐户,看看一切是不是正常了?

# exec /sbin/init

如何重置CentOS/RHEL 7中遗忘的根用户帐户密码?

登录根用户

上图清楚地显示,我们已通过从单一用户模式重置根帐户密码,成功登录进入到RHEL 7系统。

上述几个步骤清楚地显示了如何通过从单一用户模式重置根帐户密码,登录到RHEL 7和CentOS 7机器。

英文:Single User Mode: Resetting/Recovering Forgotten Root User Account Password in RHEL/CentOS 7

开源云笔记–leanote

使用golang 开发,开源下载源代码,建立私有云笔记。 http://leanote.com/ 

虽然目前在知识管理/笔记类软件领域有强大的印象笔记 (Evernote)、微软 OneNote、国产的为知笔记以及有道云笔记等都是非常优秀的产品,但经常还有人询问有没轻量快速的笔记工具?

于是我们推荐了极简小巧的 NotationCintaNotes,但它们在“云”同步功能上却又差了一截。而今天推荐的,则是一款纯粹的在线云笔记工具——Leanote!它最大的特点就是简约、免费、开源、支持 Markdown 语法,支持程序代码高亮、笔记历史记录、支持笔记分享协作、将笔记发布成博客等功能……

Leanote是一款国产的在线网页版云笔记软件, 集知识管理、笔记、分享、博客功能于一身,界面简约但功能不简单!它支持多笔记本、标签分类、笔记共享、添加保存附件等,而且还提供了免打扰写作模式、支持图片尺寸调整、并且支持 Markdown 语法写作,最重要的是,它还能完美支持代码高亮显示!

Leanote

该项目采用 Golang+MongoDB 开发,现已完全开源并能免费使用。普通用户可以直接使用 Leanote 提供的公共服务,也可以自行搭建属于自己或公司局域网内的私有云笔记平台。 而且,Leanote 可以让用户创建一个用户组,并将笔记共享到这个组里,所有组员都可以浏览、编辑笔记,可以非常方便地进行协作或知识共享。(题外话:团队内还可以通过 SeaFile 搭建私有的云存储配合使用)

Leanote 是一个基于 WEB 网页版的产品,无论是 Windows、MacLinux 还是 AndroidiOS 手机用户都可以通过浏览器直接访问 Leanote。而且,现在 Leanote for Windows 和 Mac 版的客户端也都已经出来了。不管是客户端,还是网页版,Leanote 的撰写、编辑笔记体验还是相当不错的!

为什么要 Leanote?它有什么特点?

下面是 Leanote 作者的原话:“总有朋友问我,为什么要做 Leanote?我每次都说:因为我不喜欢 Evernote、有道之类的笔记产品,不好贴代码 (程序员的硬性需求)。而且 Evernote 的客户端竟然不能修改图片大小,没有文档导航。这些都是我不能忍受的,我觉得知识就应该有条理,有条理怎么能没有标题导航呢?而对于程序员,贴代码后格式会乱掉怎么能忍受?”

出于这些不能忍受的问题加上不爽印象笔记,这位程序员最后任性了一次,自己动手做了这么一个支持代码格式高亮显示的清爽在线云笔记——Leanote!下面是我随手截的一段 PHP 代码的高亮效果。

Leanote 代码高亮

Leanote 坚信轮子+轮子=产品,庆幸如今身处一个开放的环境,可以将一切好的东西吸收进来不断完美。目前,Leaonte 没有自己开发代码编辑器,而是集成了当今最好用的 Ace 代码编辑器,而 Markdown编辑器方面也是集成了当今最好用的 StackEdit 编辑器。下面是 Leanote 的 Markdown 编辑效果截图:

Leanote Markdown 编辑器

写在后面:

无论在工作还是生活方面,如果觉得印象笔记或目前你使用的笔记软件的编辑器不能满足你的需求,不能很好地贴代码片段、图片不能缩放、不能写 Markdown?或者希望能将知识共享出去,能将笔记快速变成博客文章,而不用特意去搭建维护一个 WordPress?又或者你希望拥有一个私有的笔记平台,那么不妨试试 Leaonte 吧,相信你会发现这是一个相当不错的开源项目…

 

转自:http://www.iplaysoft.com/leanote.html

golang在小米抢购系统

Mark

http://www.csdn.net/article/2014-11-07/2822545

转载自:http://www.csdn.net/article/2014-11-07/2822545

原标题:“米粉节”背后的故事——小米网抢购系统开发实践

2014年的米粉节

2014年4月9日凌晨,我和同事们对小米网的抢购系统做了最后的检查与演练。几个小时后,小米网今年开年来最重要的一次大型活动“米粉节”就要开始了。

这次米粉节活动,是小米电商的成人礼,是一次重要的考试。小米网从网站前端、后台系统、仓储物流、售后等各个环节,都将接受一次全面的压力测试。

10点整,一波流量高峰即将到来,几百万用户将准点挤入小米网的服务器。而首先迎接压力冲击的,就是挡在最前面的抢购系统。

而这个抢购系统是重新开发、刚刚上线不久的,这是它第一次接受这样严峻的考验。

系统能不能顶住压力?能不能顺畅正确地执行业务逻辑?这些问题不到抢购高峰那一刻,谁都不能百分百确定。

9点50分,流量已经爬升得很高了;10点整,抢购系统自动开启,购物车中已经顺利加入了抢购商品。

一两分钟后,热门的抢购商品已经售罄自动停止抢购。抢购系统抗住了压力。

我长舒一口气,之前积累的压力都消散了。我坐到角落的沙发里,默默回想抢购系统所经历的那些惊心动魄的故事。这可真是一场很少人有机会经历的探险呢。

抢购系统是怎样诞生的

时间回到2011年底。小米公司在这一年8月16日首次发布了手机,立刻引起了市场轰动。随后,在一天多的时间内预约了30万台。之后的几个月,这30万台小米手机通过排号的方式依次发货,到当年年底全部发完。

然后便是开放购买。最初的开放购买直接在小米的商城系统上进行,但我们那时候完全低估了“抢购”的威力。瞬间爆发的平常几十倍流量迅速淹没了小米网商城服务器,数据库死锁、网页刷新超时,用户购买体验非常差。

市场需求不等人,一周后又要进行下一轮开放抢购。一场风暴就等在前方,而我们只有一周的时间了,整个开发部都承担着巨大的压力。

小米网可以采用的常规优化手段并不太多,增加带宽、服务器、寻找代码中的瓶颈点优化代码。但是,小米公司只是一家刚刚成立一年多的小公司,没有那么多的服务器和带宽。而且,如果代码中有瓶颈点,即使能增加一两倍的服务器和带宽,也一样会被瞬间爆发的几十倍负载所冲垮。而要优化商城的代码,时间上已没有可能。电商网站很复杂,说不定某个不起眼的次要功能,在高负载情况下就会成为瓶颈点拖垮整个网站。

这时开发组面临一个选择,是继续在现有商城上优化,还是单独搞一套抢购系统?我们决定冒险一试,我和几个同事一起突击开发一套独立的抢购系统,希望能够绝境逢生。

摆在我们面前的是一道似乎无解的难题,它要达到的目标如下:

  • 只有一周时间,一周内完成设计、开发、测试、上线;
  • 失败的代价无法承受,系统必须顺畅运行;
  • 抢购结果必须可靠;
  • 面对海量用户的并发抢购,商品不能卖超;
  •  一个用户只能抢一台手机;
  • 用户体验尽量好些。

设计方案就是多个限制条件下求得的解。时间、可靠性、成本,这是我们面临的限制条件。要在那么短的时间内解决难题,必须选择最简单可靠的技术,必须是经过足够验证的技术,解决方案必须是最简单的。

在高并发情况下,影响系统性能的一个关键因素是:数据的一致性要求。在前面所列的目标中,有两项是关于数据一致性的:商品剩余数量、用户是否已经抢购成功。如果要保证严格的数据一致性,那么在集群中需要一个中心服务器来存储和操作这个值。这会造成性能的单点瓶颈。

在分布式系统设计中,有一个CAP原理。“一致性、可用性、分区容忍性”三个要素最多只能同时实现两点,不可能三者兼顾。我们要面对极端的爆发流量负载,分区容忍性和可用性会非常重要,因此决定牺牲数据的强一致性要求。

做出这个重要的决定后,剩下的设计决定就自然而然地产生了:

  1. 技术上要选择最可靠的,因为团队用PHP的居多,所以系统使用PHP开发;
  2. 抢资格过程要最简化,用户只需点一个抢购按钮,返回结果表示抢购成功或者已经售罄;
  3. 对抢购请求的处理尽量简化,将I/O操作控制到最少,减少每个请求的时间;
  4. 尽量去除性能单点,将压力分散,整体性能可以线性扩展;
  5. 放弃数据强一致性要求,通过异步的方式处理数据。

最后的系统原理见后面的第一版抢购系统原理图(图1)。

图1  第一版抢购系统原理图

系统基本原理:在PHP服务器上,通过一个文件来表示商品是否售罄。如果文件存在即表示已经售罄。PHP程序接收用户抢购请求后,查看用户是否预约以及是否抢购过,然后检查售罄标志文件是否存在。对预约用户,如果未售罄并且用户未抢购成功过,即返回抢购成功的结果,并记录一条日志。日志通过异步的方式传输到中心控制节点,完成记数等操作。

最后,抢购成功用户的列表异步导入商场系统,抢购成功的用户在接下来的几个小时内下单即可。这样,流量高峰完全被抢购系统挡住,商城系统不需要面对高流量。

在这个分布式系统的设计中,对持久化数据的处理是影响性能的重要因素。我们没有选择传统关系型数据库,而是选用了Redis服务器。选用Redis基于下面几个理由。

  1. 首先需要保存的数据是典型的Key/Value对形式,每个UID对应一个字符串数据。传统数据库的复杂功能用不上,用KV库正合适。
  2. Redis的数据是in-memory的,可以极大提高查询效率。
  3. Redis具有足够用的主从复制机制,以及灵活设定的持久化操作配置。这两点正好是我们需要的。

在整个系统中,最频繁的I/O操作,就是PHP对Redis的读写操作。如果处理不好,Redis服务器将成为系统的性能瓶颈。

系统中对Redis的操作包含三种类型的操作:查询是否有预约、是否抢购成功、写入抢购成功状态。为了提升整体的处理能力,可采用读写分离方式。

所有的读操作通过从库完成,所有的写操作只通过控制端一个进程写入主库。

在PHP对Redis服务器的读操作中,需要注意的是连接数的影响。如果PHP是通过短连接访问Redis服务器的,则在高峰时有可能堵塞Redis服务器,造成雪崩效应。这一问题可以通过增加Redis从库的数量来解决。

而对于Redis的写操作,在我们的系统中并没有压力。因为系统是通过异步方式,收集PHP产生的日志,由一个管理端的进程来顺序写入Redis主库。

另一个需要注意的点是Redis的持久化配置。用户的预约信息全部存储在Redis的进程内存中,它向磁盘保存一次,就会造成一次等待。严重的话会导致抢购高峰时系统前端无法响应。因此要尽量避免持久化操作。我们的做法是,所有用于读取的从库完全关闭持久化,一个用于备份的从库打开持久化配置。同时使用日志作为应急恢复的保险措施。

整个系统使用了大约30台服务器,其中包括20台PHP服务器,以及10台Redis服务器。在接下来的抢购中,它顺利地抗住了压力。回想起当时的场景,真是非常的惊心动魄。

第二版抢购系统

经过了两年多的发展,小米网已经越来越成熟。公司准备在2014年4月举办一次盛大的“米粉节”活动。这次持续一整天的购物狂欢节是小米网电商的一次成人礼。商城前端、库存、物流、售后等环节都将经历一次考验。

对于抢购系统来说,最大的不同就是一天要经历多轮抢购冲击,而且有多种不同商品参与抢购。我们之前的抢购系统,是按照一周一次抢购来设计及优化的,根本无法支撑米粉节复杂的活动。而且经过一年多的修修补补,第一版抢购系统积累了很多的问题,正好趁此机会对它进行彻底重构。

第二版系统主要关注系统的灵活性与可运营性(图2)。对于高并发的负载能力,稳定性、准确性这些要求,已经是基础性的最低要求了。我希望将这个系统做得可灵活配置,支持各种商品各种条件组合,并且为将来的扩展打下良好的基础。

图2  第二版系统总体结构图

在这一版中,抢购系统与商城系统依然隔离,两个系统之间通过约定的数据结构交互,信息传递精简。通过抢购系统确定一个用户抢得购买资格后,用户自动在商城系统中将商品加入购物车。

在之前第一版抢购系统中,我们后来使用Go语言开发了部分模块,积累了一定的经验。因此第二版系统的核心部分,我们决定使用Go语言进行开发。

我们可以让Go程序常驻内存运行,各种配置以及状态信息都可以保存在内存中,减少I/O操作开销。对于商品数量信息,可以在进程内进行操作。不同商品可以分别保存到不同的服务器的Go进程中,以此来分散压力,提升处理速度。

系统服务端主要分为两层架构,即HTTP服务层和业务处理层。HTTP服务层用于维持用户的访问请求,业务处理层则用于进行具体的逻辑判断。两层之间的数据交互通过消息队列来实现。

HTTP服务层主要功能如下:

  1. 进行基本的URL正确性校验;
  2. 对恶意访问的用户进行过滤,拦截黄牛;
  3. 提供用户验证码;
  4. 将正常访问用户数据放入相应商品队列中;
  5. 等待业务处理层返回的处理结果。

业务处理层主要功能如下:

  1. 接收商品队列中的数据;
  2. 对用户请求进行处理;
  3. 将请求结果放入相应的返回队列中。

用户的抢购请求通过消息队列,依次进入业务处理层的Go进程里,然后顺序地处理请求,将抢购结果返回给前面的HTTP服务层。

商品剩余数量等信息,根据商品编号分别保存在业务层特定的服务器进程中。我们选择保证商品数据的一致性,放弃了数据的分区容忍性。

这两个模块用于抢购过程中的请求处理,系统中还有相应的策略控制模块,以及防刷和系统管理模块等(图3)。

图3 第二版系统详细结构图

图3  第二版系统详细结构图

在第二版抢购系统的开发过程中,我们遇到了HTTP层Go程序内存消耗过多的问题。

由于HTTP层主要用于维持住用户的访问请求,每个请求中的数据都会占用一定的内存空间,当大量的用户进行访问时就会导致内存使用量不断上涨。当内存占用量达到一定程度(50%)时,Go中的GC机制会越来越慢,但仍然会有大量的用户进行访问,导致出现“雪崩”效应,内存不断上涨,最终机器内存的使用率会达到90%以上甚至99%,导致服务不可用。

在Go语言原生的HTTP包中会为每个请求分配8KB的内存,用于读缓存和写缓存。而在我们的服务场景中只有GET请求,服务需要的信息都包含在HTTP Header中,并没有Body,实际上不需要如此大的内存进行存储。

为了避免读写缓存的频繁申请和销毁,HTTP包建立了一个缓存池,但其长度只有4,因此在大量连接创建时,会大量申请内存,创建新对象。而当大量连接释放时,又会导致很多对象内存无法回收到缓存池,增加了GC的压力。

HTTP协议是构建在TCP协议之上的,Go的原生HTTP模块中是没有提供直接的接口关闭底层TCP连接的,而HTTP 1.1中对连接状态默认使用keep-alive方式。这样,在客户端多次请求服务端时,可以复用一个TCP连接,避免频繁建立和断开连接,导致服务端一直等待读取下一个请求而不释放连接。但同样在我们的服务场景中不存在TCP连接复用的需求。当一个用户完成一个请求后,希望能够尽快关闭连接。keep-alive方式导致已完成处理的用户连接不能尽快关闭,连接无法释放,导致连接数不断增加,对服务端的内存和带宽都有影响。

通过上面的分析,我们的解决办法如下。

  1. 在无法优化Go语言中GC机制时,要避免“雪崩效应”就要尽量避免服务占用的内存超过限制(50%),在处于这个限制内时,GC可以有效进行。可通过增加服务器的方式来分散内存压力,并尽力优化服务占用的内存大小。同时Go 1.3也对其GC做了一定优化。
  2. 我们为抢购这个特定服务场景定制了新的HTTP包,将TCP连接读缓存大小改为1KB。
  3. 在定制的HTTP包中,将缓存池的大小改为100万,避免读写缓存的频繁申请和销毁。
  4. 当每个请求处理完成后,通过设置Response的Header中Connection为close来主动关闭连接。

通过这样的改进,我们的HTTP前端服务器最大稳定连接数可以超过一百万。

第二版抢购系统顺利完成了米粉节的考验。

总结

技术方案需要依托具体的问题而存在。脱离了应用场景,无论多么酷炫的技术都失去了价值。抢购系统面临的现实问题复杂多变,我们也依然在不断地摸索改进。

golang 删除七天前的文件

使用golang 清理备份文件。

package main

import (
	//"flag"
	"fmt"
	"os"
	"path/filepath"
	"time"
)

const (
	diff_time = 3600 * 24 * 7
)

func main() {
	//flag.Parse()
	//root := flag.Arg(0)
	root := "."
	getFilelist(root)
}

func getFilelist(path string) {
	now_time := time.Now().Unix() //当前时间,使用Unix时间戳
	err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}
		file_time := f.ModTime().Unix()
		/*
			fmt.Println(file_time)
			fmt.Println(now_time)
			fmt.Println("---", diff_time)
			fmt.Println(now_time - file_time)
		*/
		if (now_time - file_time) > diff_time { //判断文件是否超过7天
			fmt.Printf("Delete file %v !\r\n", path)
			os.RemoveAll(path)
		} //else {
		//println(path)
		//}
		return nil
	})
	if err != nil {
		fmt.Printf("filepath.Walk() returned %v\r\n", err)
	}
}

 

参考文档:
http://www.cnblogs.com/sevenyuan/archive/2013/02/28/2937275.html
https://github.com/jemygraw/GoStandardLibrary-Chinese/blob/master/os/os.md

那些小众产品

转自:http://coolfiry.iteye.com/blog/2186021

 

下面这些是我使用过一些小众产品,有些是APP,有些是网站,或者既有APP也有网站。 所谓小众即是用户量不大,在某个垂直领域内拥有一定的知名度。当然下众谈到某些小众产品可能现在流量已经变的很高了,已经变成了大众产品了。

一、蝉游记  chanyouji.com

知道蝉游记是因为我长期关注纯银V,纯银V是国内产品设计、用户体验设计领域的名人,曾经在网易是一个产品总监,做网易相册产品。 蝉游记是他从网易离职后的创业作品,现在蝉游记已经被携程股,不过携程比较少参与到蝉游记的具体管理中,保持了产品的独立性。

 

蝉游记是一套用于在旅游途中轻松制作游记的工具,其运营方式是以工具为出发点,逐步建立基于游记的社区。工具性也决定了蝉游记偏向移动端的特性。

现在的蝉游记已经在游记这个领域有了比较高的市场占有率,曾经长期得到appstore中国区的推荐,同时被装机到iphone的演示机中,这对于一个创业性产品来说是非常难得的。

下面来谈谈我认为为什么携程要控股蝉游记,我认为携程最重要的是看中游记数据,游记的附件加的结构化数据和携程自身的游记数据是类似的,但是携程没有UGC的属性,将携程和蝉游记打通能够建立更加完整的旅游生态系统。

二、简书www.jianshu.com

简书是一家上海公司的创业作品,先有pc网站,后有移动端,简书是一个将写作与阅读整合在一起的网络产品。旨在为写作者打造最优秀的写作软件 ,为阅读者打造最优雅的阅读社区。 简书也是最初从一个工具特性出来,最初在圈子内流传开来是因为其写作体验比较好,至少我最初看到的是这样。现在的简书已经成为一个高质量原则阅读平台。 简书给人的感觉是一款小清新类的产品。

三、轻单  qdan.me

轻单是更是一个有意思的新产品,现阶段只有web产品,相应未来肯定会推出移动端产品。轻单以最便捷的方式分享知识,并瞬间获取他人的经验, 轻单将内容包装为结构化、条理化的轻巧形态,方便移动时代和碎片时代的人们对价值的需求。

简单化的产品理念和用户创造的有用的价值分享,这样一个UGC社区是我想要用的,从中可以学习到很多有价值的经验。个人认为轻单会有比较好的发展,不过其发展路线应该类似于知乎,前期发发展缓慢,在内容量逐渐提高了将会在突飞猛进的发展。

轻单,简书,都会强烈地感觉到,这些产品最核心的东西,是创始人对产品独特的理解,在他脑袋里,这款产品“就该长成什么样子”。从这种独特的想象力上面,再生长出来功能/交互/视觉。同样的产品由不同人团队做出来的感受可能有很大的差异。

Mathematica Table数据导出到文件如何自定义分隔符

解决百度知道问题:http://zhidao.baidu.com/question/1175318960009451299.html

原问题:
Mathematica 输出数据之间的长空格

代码如下,输出的数据之间空格太大太长,我只要一个小空格就可以了,怎么实现?

aaa = {{1, 2}, {3, 4}};
Export["C:\data\a1234.dat", aaa, "Table"];

 

解决方法加一个option, "FieldSeparators" -> "分隔符"
aaa = {{1, 2}, {3, 4}};
Export["d:\\a1234.dat", aaa, "Table", "FieldSeparators" -> " "];

参考:ref/format/Table(F1调出帮助,输入这个),帮助中还有很多可以修改的option 值得继续尝试。