首页 文章 精选 留言 我的

精选列表

搜索[增删改查],共9394篇文章
优秀的个人博客,低调大师

每日一博 | 问题这样查,拒做背锅侠

技术的锅太多,到底该不该你背? 话说这天一大早,那个悲催的中年架构师大刘又被手机微信群给炸醒。部门的运维兄弟在公司微信群里说: 短信的生产环境服务器 CPU 占用率过高,疯狂报警。是不是你们昨天上线看门狗导致的? 大刘迷了巴登的想了想,没错,昨天确实给短信服务装上了看门狗。但是看门狗服务肯定不会有问题(架构师必备的蜜汁自信),而且上线之前各轮测试也都测过了,没见过这个想象啊。 难道是测试妹子没测试到位?难道线上短信应用自身出现了问题? 生产无小事,小事更不能忽视,主要是怕扣绩效奖金。大刘迅速打开电脑,打开 VPN ,远程登上短信生产服务器,开始大刘最拿手的 2W1H 三板斧诊断之旅。 接下来的诊断内容有点烧脑,节奏有点快,请大家坐稳扶好。 1. 病号是谁(WHO)? 大刘拿出控制台诊断仪器,输入 top 命令一探究竟。我勒个去,不看不知道一看吓一跳,PID 为 1878 的病号,CPU 占用居然 200% 多。 问题算是定位到了,但是 PID 为 1878 的病号到底是谁,难道真是昨天上线的看门狗 ? 虽然大刘久经职场,但是排查生产问题时,内心还是比较忐忑,毕竟这是生产环境。 说时迟那时快,只见大刘一个命令输入: ps -ef | grep 1878 定睛一看,原来是放屁瞅别人,短信服务自己在作祟,和看门狗没关系,大刘心里一下子平缓了不少。 锅找到了主儿,其实这个时候大刘完全可以把这个问题甩给短信开发团队,但是大刘最喜欢做的不是甩锅,而是打破砂锅刨到底。 2. 病号哪里出了问题(WHERE)? 为什么 1878 号病人占用 CPU 会这么高呢? 只见黑乎乎的控制台诊断仪器上,大刘熟练的输入: jstack -l 1878 >> 1878号病历.log 这样便得到一份 1878 号病人的病历详情单,一会儿用得上。 到底 1878 号病人的哪个部位出了问题呢? 话没说完,只见大刘又在控制台诊断仪器上,输入一个: top -Hp 1878 白板黑字,把 1878 号病人的器官信息全部列了出来。 看到结果,甚是一惊,PID 代号为 8721 的器官占用 CPU 100% 多。 疑惑油然而生,这个 PID 代号 为 8721 的器官是啥,是头、是眼睛、还是胳膊腿呢?这些器官展示的 PID 列都是昵称,都这么善于伪装,如何揭露它的真面目呢? 还好大刘有高招,借助照妖镜算法,熟练的输入: printf "%x\n" 8721 果真使得代号为 8721 的器官,现了真身,真实身份居然是 2211 的呼吸道,怪不得病号一直气喘吁吁,上气不接下气。 到这一步还无法对症下药啊,还需要进一步确诊 2211 的呼吸道到底出了什么幺蛾子,导致 1878 号病人一直气喘吁吁,上气不接下气? 只见黑乎乎的控制台诊断仪器上,大刘再次飞一般的在输入: grep 2211 -A20 1878号病历.log 诊断结果随之显示在诊断仪器上。 曾经背了很多锅的大刘,看到诊断结果心里乐了一下,一眼就看出是高并发情况下用了 HashMap 的问题(请大家们自行寻找谷歌、百度,就不在此深入展开啦),终于拨开云雾见青天。 3. 如何对症下药( HOW )? 在大刘行云流水没有一丝一毫的拖泥带水般的神操作下,1878 号病人的诊断也就结束了,这个锅就彻底被打破了。 术业有专攻,大刘就可以郑重的告诉短信开发同事具体原因了,捉得病根,开发同事也就可以对症下药啦。 大刘这套行走江湖的诊断问题方式你 get 到了没?大刘自己简单概括为 2W1H 三板斧:病号是谁、病号哪里出了问题、对症下药。 1、病号是谁?(WHO) 第一步:采用 top 命令,找出 CPU 占用最高的病号 PID ; 第二步:通过 ps -ef | grep PID 查看病号对应的真实身份。 2、病号哪里出了问题?(WHERE) 第一步:采用 jstack -l PID >> PID.log 获取病号的各器官信息的病历单; 第二步:采用 top -Hp PID 拿到占用 CPU 最高的器官昵称 PID ; 第三步:采用 printf "%x\n" PID 根据器官昵称 PID 的拿到器官真实身份 TID ; 第四步:采用 grep TID -A20 pid.log 根据 TID 去病历单中匹配,确定是哪出了问题。 3、捉得病根、便可拿出医药箱,对症下药啦。(HOW) 作为程序猿,工作中难免会遇到不少类似这样的问题。面对问题,你如果像无头苍蝇一样乱撞,撞得头破血流依然不知道缘由,在背锅即将成为现实时,那就不妨试试大刘的 2W1H 三板斧的诊断方式,说不定会帮你快速定位、解决线上问题,毕竟快速的解决生产问题会把损失降到最低。 最后,想对大家说一句: 作为程序猿,一定要有程序猿的态度。避免背锅,拒绝甩锅,打破砂锅,从你我做起。 你好,我是四猿外,一家上市公司的技术总监,管理的技术团队一百余人。 我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。 我会把自己的成长故事写成文章,把枯燥的技术文章写成故事。 欢迎关注我的公众号:四猿外

优秀的个人博客,低调大师

【python】openstack管理小工具(增删查改,批量ping)

工具介绍: 创建虚拟机会使用多线程队列的方式去控制同时创建的虚拟机数量 如果在创建的虚拟机比较多,会2次创建。第一次会在各个宿主机上创建一台,其余的会再第一次创建成功后创建。 因为第一次创建需要传输镜像会比较慢,在宿主机上已经有对应的镜像后,再次创建相同镜像的虚拟机,不再需要传输相应的镜像(所有相同镜像的虚拟机共用同一个后端镜像,openstack对镜像管理使用copy on write技术) 查询和更改主要都是通过查询数据库实现。 其它功能自测。 使用帮助: python openstack_manager.py --help 创建虚拟机: python openstack_manager.py -c -f vmhost -t nslm -c, 指定是要进行创建虚拟机 , -f 指定要创建的虚拟机列表文件 , -t 指定要给那个项目创建虚拟机 删除虚拟机: python openstack_manager.py -d ip1 ip2 -d 指定要删除的ip ,可以跟多个 查看某个虚拟机信息 python openstack_manager.py -i ip1 ip2 -i 指定ip,后面可以跟上多个值 查看宿主机下的虚拟机信息 python openstack_manager.py -n node1 node2 -n 指定node,可以跟上多个值 更改虚拟机配置: python openstack_manager.py -u ip -F flavor -u指定某个ip, -F 指定某个配置 批量ping: python openstack_manager.py -p -f vmhost -p指定进行批量ping,-f指定文件 从文件中获取创建虚拟机的命令 (创建过程中某个虚拟机出错,可以进行查看创建虚拟机命令进行手动创建) python openstack_manager.py -g -f vmhost -t -g指定要进行获取命令,-f指定文件,-t指定项目 -f 指定文件的文件格式: 批量ping是检查ip虚拟机是否存在,指定的文件也是参照此格式 nodename instance_ip flavor 一行一个虚拟机 其它使用信息: 脚本中的flavor对应的flavor id,项目帐号密码和镜像ID,数据库帐号等替换成自己生产环境中的信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 #!/usr/bin/python #coding:utf8 #Auth by lust import sys,commands,os,MySQLdb import Queue, threading,time from fabric.colors import * from optparse import OptionParser class vmListAnaly(): def __init__( self ,vmlist_file): self .f_handle = open (vmlist_file) self .vmlist = {} while True : self .file_tmp = self .f_handle.readline() if self .file_tmp: if self .vmlist.has_key( self .file_tmp.split()[ 0 ]): self .vmlist[ self .file_tmp.split()[ 0 ]].append(( self .file_tmp.split()[ 1 ], self .file_tmp.split()[ 2 ])) else : self .vmlist[ self .file_tmp.split()[ 0 ]] = [] self .vmlist[ self .file_tmp.split()[ 0 ]].append(( self .file_tmp.split()[ 1 ], self .file_tmp.split()[ 2 ])) else : break def getAllIps( self ): ips = [] for __host in self .vmlist: for i in self .vmlist[__host]: ips.append(i[ 0 ]) return ips def getFirstIps( self ): ips = [] for __host in self .vmlist: ips.append( self .vmlist[__host][ 0 ][ 0 ]) return ips def getSecondIps( self ): ips = [] for __host in self .vmlist: del self .vmlist[__host][ 0 ] for __host in self .vmlist: for i in self .vmlist[__host]: ips.append(i[ 0 ]) return ips def getAllCreInfo( self ): return self .vmlist def getFirstCreInfo( self ): results = [] for __host in self .vmlist: self .vmlist[__host] = [ self .vmlist[__host][ 0 ]] return self .vmlist def getSecondCreInfo( self ): for __host in self .vmlist: del self .vmlist[__host][ 0 ] return self .vmlist def __del__( self ): self .f_handle.close() class getCmd(): def __init__( self ,project,vminfo,flavor,mysql_host,mysql_user,mysql_passwd): self .mysql_user = mysql_user self .mysql_host = mysql_host self .mysql_passwd = mysql_passwd self .project = project self .vminfo = vminfo self .flavor = flavor self .create_cmd = [] def get_cmd( self ): quantum_obj = mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd) for __host in self .vminfo: if self .vminfo[__host]: for i in self .vminfo[__host]: __ip = i[ 0 ] __flavor = i[ 1 ] __network_id = quantum_obj.getNetworkID(__ip) __tmp = "nova --os-username %s --os-password %s --os-tenant-name %s boot --security-groups %s --flavor %s --image %s --nic net-id=%s,v4-fixed-ip=%s --meta lan=%s --availability-zone nova:%s %s" % ( self .project[ 'OS_USERNAME' ], self .project[ 'OS_PASSWORD' ], self .project[ 'OS_TENANT_NAME' ], self .project[ 'SECURITY_GROUPS' ],flavor[__flavor], self .project[ 'IMAGE_ID' ],__network_id,__ip,__ip,__host,__ip) self .create_cmd.append(__tmp) return self .create_cmd class mysqlEng(): def __init__( self ,host = '127.0.0.1' ,user = 'root' ,passwd = ' ',port=' 3306 '): self .conn = MySQLdb.connect(host = host,user = user,passwd = passwd,port = 3306 ) self .cur = self .conn.cursor() def getNetworkID( self ,ip): self .conn.select_db( 'quantum' ) net = "%s.%s.%s.0/24" % (ip.split( '.' )[ 0 ],ip.split( '.' )[ 1 ],ip.split( '.' )[ 2 ]) __sql = "select network_id from subnets where name='%s'" % net self .cur.execute(__sql) ret = self .cur.fetchall() return ret[ 0 ][ 0 ] def getVmstate( self ,ip): self .conn.select_db( 'nova' ) __sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value = %s and instances.vm_state not in ('error','deleted');" self .cur.execute(__sql,ip) ret = self .cur.fetchall() return ret[ 0 ][ 3 ] def getActNum( self ,ips): self .conn.select_db( 'nova' ) __sql = "select count(*) from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state = 'active';" % "','" .join(ips) self .cur.execute(__sql) ret = self .cur.fetchall() return ret[ 0 ][ 0 ] def updateInstanceFlavor( self ,ip,flavor): self .conn.select_db( 'nova' ) __get_flavor_info_sql = "select id,memory_mb,vcpus from instance_types where flavorid = '%s' and deleted = 0;" % flavor self .cur.execute(__get_flavor_info_sql) __flavor_info = self .cur.fetchall() __flavor_id = __flavor_info[ 0 ][ 0 ] __mem = __flavor_info[ 0 ][ 1 ] __vcpus = __flavor_info[ 0 ][ 2 ] __update_flavor_info_sql = "update instances set instance_type_id='%d',vcpus='%d',memory_mb='%d' where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';" % (__flavor_id,__vcpus,__mem,ip) self .cur.execute(__update_flavor_info_sql) self .conn.commit() def getInstanceFlavor( self ,ip): self .conn.select_db( 'nova' ) __get_instance_flavor_sql = "select vcpus,memory_mb from instances where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';" % ip self .cur.execute(__get_instance_flavor_sql) ret = self .cur.fetchall() results = (ip,ret[ 0 ][ 0 ],ret[ 0 ][ 1 ]) return results def getInstanceInfo( self ,ips): self .conn.select_db( 'nova' ) __get_instance_info_sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';" % "','" .join(ips) self .cur.execute(__get_instance_info_sql) ret = self .cur.fetchall() return ret def getNodeInfo( self ,nodes): self .conn.select_db( 'nova' ) __get_node_info_sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instances.host in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';" % "','" .join(nodes) self .cur.execute(__get_node_info_sql) ret = self .cur.fetchall() return ret def __del__( self ): self .cur.close() self .conn.close() class checkIps(): def __init__( self ): self .ping_queue = Queue.Queue() self .up_ip = [] self .down_ip = [] def __check( self ,q): while q.qsize(): __ip = q.get() __cmd = "ping -c 2 %s" % __ip if commands.getstatusoutput(__cmd)[ 0 ] = = 0 : self .up_ip.append(__ip) else : self .down_ip.append(__ip) q.task_done() def put2q( self ,ips): for __ip in ips: self .ping_queue.put(__ip) def checking( self ): print yellow( 'Checking ips ...' ) for i in xrange ( 100 ): __pingd = threading.Thread(target = self .__check,args = ( self .ping_queue)) __pingd.setDaemon __pingd.start() self .ping_queue.join() return { 'up' : self .up_ip, 'down' : self .down_ip} class createVm(): def __init__( self ,mysql_host,mysql_user,mysql_passwd): self .create_queue = Queue.Queue() self .mysql_user = mysql_user self .mysql_host = mysql_host self .mysql_passwd = mysql_passwd def __put2q( self ,cmd_list,q): while len (cmd_list) > 0 : while q.qsize() < = 3 : q.put(cmd_list.pop()) time.sleep( 1 ) if not cmd_list: break time.sleep( 1 ) def __create( self ,q): time.sleep( 5 ) while q.qsize() > 0 : __cmd = q.get() __ip = __cmd.split()[ - 1 ] print "Building %s" % __ip ret = commands.getstatusoutput(__cmd) if ret[ 0 ] = = 0 : time.sleep( 2 ) __vm_state = 'building' while __vm_state ! = 'active' : time.sleep( 5 ) __vm_state = mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getVmstate(__ip) if __vm_state = = 'error' : self .error_vms + = 1 print red( "虚拟机创建出错,IP:%s" ) % __ip break self .ok_vms + = 1 print green( "%s 创建成功,此次创建虚拟机总数:%s , 成功的虚拟机:%s ,出错的虚拟机:%s" ) % (__ip, self .all_vms, self .ok_vms, self .error_vms) else : self .error_vms + = 1 print red( "执行命令出错,IP:%s,出错信息: %s \n" ) % (__ip,ret[ 1 ]) def creating( self ,cmds,ths): self .all_vms = len (cmds) self .ok_vms = 0 self .error_vms = 0 __put_thread = threading.Thread(target = self .__put2q, args = (cmds, self .create_queue)) __put_thread.setDaemon __put_thread.start() for i in xrange (ths): __created = threading.Thread(target = self .__create, args = ( self .create_queue,)) __created.setDaemon __created.start() time.sleep( 10 ) class createAllvm(): def __init__( self ,vmlist,flavor,mysql_host,mysql_user,mysql_passwd): self .vmlist = vmlist self .mysql_host = mysql_host self .mysql_user = mysql_user self .mysql_passwd = mysql_passwd self .flavor = flavor def start( self ): create_obj = createVm(mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd) first_create_cmd = getCmd(project_info,vmListAnaly( self .vmlist).getFirstCreInfo(), self .flavor,mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd).get_cmd() create_obj.creating(first_create_cmd, 2 ) first_ips = vmListAnaly( 'vmhost' ).getFirstIps() while True : time.sleep( 10 ) if mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getActNum(first_ips) = = len (first_ips): break print '第一波创建完毕' second_create_cmd = getCmd(project_info,vmListAnaly( self .vmlist).getSecondCreInfo(), self .flavor,mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd).get_cmd() if not second_create_cmd: print green( '只有一波了..创建完毕' ) sys.exit() create_obj.creating(second_create_cmd, 3 ) second_ips = vmListAnaly( 'vmhost' ).getSecondIps() while True : time.sleep( 10 ) if mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getActNum(second_ips) = = len (second_ips): break print '第二波创建完毕' if __name__ = = '__main__' : #project_name = sys.argv[1] #vmlist = sys.argv[2] mysql_host = '127.0.0.1' mysql_user = 'root' mysql_passwd = '123456' parser = OptionParser() parser.add_option( "-c" , "--create" ,dest = "create" ,action = "store_true" ,default = False , help = "create vm in filename" ) parser.add_option( "-u" , "--update" ,dest = "update" , help = "update ip to a flavor" ) parser.add_option( "-p" , "--ping" ,dest = "ping" ,action = "store_true" ,default = False , help = "multil threading to ping" ) parser.add_option( "-i" , "--instances" ,dest = "instances" , help = "query a ip's info" ) parser.add_option( "-n" , "--nodes" ,dest = "nodes" , help = "query a host's info" ) parser.add_option( "-g" , "--getcmd" ,dest = "getcmd" ,action = "store_true" ,default = False , help = "get build vm commands from a file" ) parser.add_option( "-d" , "--delete" ,dest = "delete" , help = "delete a instance" ) parser.add_option( "-f" , "--filename" ,dest = "filename" , help = "Specify a file" ) parser.add_option( "-F" , "--flavor" ,dest = "flavor" , help = "Specify a flavor" ) parser.add_option( "-t" , "--tenant" ,dest = "tenant" , help = "Specify a tenant" ) (options,args) = parser.parse_args() project_conf = { 'test' :{ 'OS_USERNAME' : 'test' , 'OS_PASSWORD' : 'test' , 'OS_TENANT_NAME' : 'test' , 'SECURITY_GROUPS' : 'default' , 'IMAGE_ID' : '25b349f2-a105-4d2d-aabe-89253e8b4eb1' , }, 'test2' :{ 'OS_USERNAME' : 'test2' , 'OS_PASSWORD' : 'test2' , 'OS_TENANT_NAME' : 'test2' , 'SECURITY_GROUPS' : 'default' , 'IMAGE_ID' : 'a6955dde-7794-45cc-a468-65ce7d2473c1' , }, } flavor = { '1' : '1' , '2' : '2' , '4' : '4' , '6' : '6' , '8' : '8' , '12' : '12' , '16' : '16' , } the_mysql_obj = mysqlEng(host = mysql_host,user = mysql_user,passwd = mysql_passwd) if options.create: project_info = project_conf[options.tenant] vmfile = options.filename the_create_obj = createAllvm(vmlist = vmfile,flavor = flavor,mysql_host = mysql_host,mysql_user = mysql_user,mysql_passwd = mysql_passwd) the_create_obj.start() if options.update: ip = options.update flavor = options.flavor the_mysql_obj.updateInstanceFlavor(ip,flavor) print "update ok,now the vm %s is %s cups and %sMB memory" % the_mysql_obj.getInstanceFlavor(ip) instance_id = the_mysql_obj.getInstanceInfo([ip])[ 0 ][ 0 ] print red( 'please command == nova reboot --hard %s == to effect' % instance_id) if options.ping: filename = options.filename allip = vmListAnaly(filename).getAllIps() check_obj = checkIps() check_obj.put2q(allip) check_ret = check_obj.checking() if check_ret[ 'up' ]: for ip in check_ret[ 'up' ]: print red( "%s is up,please check..." ) % ip sys.exit( 9 ) else : print green( 'All ip is check ok...,you can create these vms' ) if options.instances: args.append(options.instances) ips = args instances_info = the_mysql_obj.getInstanceInfo(ips) print "id\t\t\t\t\tip\t\tnode\t\t\tstate\tmemory" for i in instances_info: print "%s\t%s\t%s\t%s\t%s" % i if options.nodes: args.append(options.nodes) nodes = args nodes_info = the_mysql_obj.getNodeInfo(nodes) print "id\t\t\t\t\tip\t\tnode\t\t\tstate\tmemory" for i in nodes_info: print "%s\t%s\t%s\t%s\t%s" % i if options.getcmd: filename = options.filename tenant = options.tenant project_info = project_conf[tenant] result = getCmd(project_info,vmListAnaly(filename).getAllCreInfo(),flavor,mysql_host = mysql_host,mysql_user = mysql_user,mysql_passwd = mysql_passwd).get_cmd() for i in result: print i if options.delete: args.append(options.delete) ips = args instances_ids = [] instances_info = the_mysql_obj.getInstanceInfo(ips) for i in instances_info: instances_ids.append(i[ 0 ]) if not instances_ids: print red( "no instance found" ) sys.exit( 8 ) delete_cmd = "nova delete " + ' ' .join(instances_ids) result = commands.getstatusoutput(delete_cmd) if result[ 0 ] = = 0 : print green( 'OK' ) else : print red( "error info: %s" % result[ 1 ]) 本文转自lustlost 51CTO博客,原文链接:http://blog.51cto.com/lustlost/1375779,如需转载请自行联系原作者

优秀的个人博客,低调大师

小蝶量化:数据中心成本暴增 甲骨文又暴雷?

7月18日,据The Information报道,甲骨文在新墨西哥州推进的165亿美元AI超级园区项目遭遇环保审批阻碍,被迫更换供电方案,导致成本骤增数十亿美元。与此同时,该公司在威斯康星州的数据中心项目也面临额外逾1亿美元的监管合规支出。上周,标普全球将甲骨文长期发行人信用评级下调至投资级上方仅一档,理由是"持续低估"其资本支出规模。公众号关注:博森科技小蝶。

优秀的个人博客,低调大师

Omdia:预计中国生成式 AI 软件市场五年增超 4 倍

Omdia发布报告称,2024年中国的生成式人工智能(GenAI)软件收入已达到18亿美元。 鉴于该技术仍处于起步阶段,预计未来五年的市场规模将增长超4倍,到2029年达到98亿美元。这一收入还不包括其他关键GenAI技术,如人工智能训练和推理芯片和服务器、人工智能数据中心建设和场地购置成本,以及GenAI开发平台收入。 报告指出,GenAI 厂商无法单靠消费者市场来生存。像 OpenAI 这样的 GenAI 市场领导者都无法单凭面向消费者的对话式人工智能来维持营收。中国 GenAI 解决方案供应商正将企业应用作为更具商业可行性的前进道路。其中,面向企业市场的智能体成为新赛道。 阿里巴巴、百度、华为和腾讯等主要厂商正在为企业提供智能体开发平台、现成模板和针对特定应用的智能体,同时大幅降低大模型推理的价格。 进入到 2025 年,Omdia 预计这些厂商将进一步开发智能体相关的能力,包括多模态大模型、多智能体协作和协调框架、支援其他数据类型的检索增强生成(RAG),以及支援边缘侧和端侧应用的更小、更高效的行业模型和小模型。其中的佼佼者正是DeepSeek。企业能利用他们的强化学习和蒸馏技术将大模型部署在在资源受限的的运行环境中。 同时,中国企业也需要在严重的资源限制和严格的法规环境下部署 GenAI,因此他们对 GenAI 投资回报率(ROI)的审查也将越来越严格。 眼看GenAI六小虎的发展,预计 2025 年新大模型的开发门槛将大大提高。并非所有厂商都能从万卡过渡到十万卡、从单个大规模数据中心到多个数据中心互联。因此,今年有可能将出现频密的市场整合和玩家退圈。 Omdia 预计数个大模型厂商将转型为 GenAI 平台或 GenAI 应用厂商,并将重心放在海外市场。

优秀的个人博客,低调大师

Filecoin正式启动NFT分布式存储服务,恐增更多安全威胁

近日,分布式存储协议Filecoin宣布推出了一项全新的免费服务:NFT.Storage,该项服务是专为不可分割、不可替代、独一无二的,不可替代的代币(NFT)推出的分布式存储链下合约,允许用户离线保存NFT元数据和内容。 “ NFT是人类文化遗产的一部分,设计长期可访问的NFT数据至关重要。”Filecoin官方Protocol Labs实验室的工程师Mikeal Rogers说:“内容寻址和分布式存储网络确保数字艺术品、篮球卡和虚拟不动产长期安全可用。” 为什么存储NFT很重要? NFT是密码学上唯一的令牌,可以用来表示数字内容,例如艺术品和音乐。由于它们不可互换,稀缺并且可以作为一种或小批量铸造,因此,NFT在收藏家群体中如雨后春笋般涌现,其中不乏一些以高得离谱的价格成交,市场非常火爆。 但是有一个问题!尽管NFT名义上可以代表艺术品,音乐或视频,但就此而言,区块链令牌实际上并不包含文件本身,甚至不包含其作者的名字。取而代之的是,NFT本质上是元数据的集合,指向它们所代表的文件链接,这些链接需要由第三方(例如拍卖平台)托管。 正因为如此,如果它们所代表的文件在互联网上不再可用,数百万美元的非金融交易就有可能失效。例如,如果托管文件的第三方公司破产了,且没有任何可证明的东西将NFT连接到实际的媒体文件,NFT甚至可能失去其作为真实性和所有权的数字证书的身份。 保持文件可访问性 为了解决这个问题,Filecoin官方Protocol Labs实验室和云存储服务提供商Pinata引入了一种去中心化协议NFT.Storage,该协议允许用户通过内容寻址和去中心化存储来“备份”NFT和相应的媒体文件。 NFT.Storage完全基于Filecoin主网和星际文件系统(IPFS)技术推出,IPFS技术可以让用户自由创建文件内容的哈希值(内容标识符或CID),以便于查找相应的文件,而这些文件被托管在世界各地的IPFS节点上,此方法可以确保只要有一台主机能提供访问服务,便始终可以找到这些文件,这里当然也包括NFT所附带的文件。 云存储服务提供商Pinata通过官网强调,NFT.Storage服务可以为客户的NFT提供“安全且可验证的文件”,用户在通过Pinata服务器上传内容时,需在铸造NFT代币NFS之前绑定文件内容的IPFS CID。 Filecoin官方在公告中表示,这种称为内容寻址的方法,可以有效防止诸如防止丢失或被“rug-pulls"的问题,因为所有CID是从内容本身生成的。NFT.Storage使用Filecoin进行长期分散的数据存储代理存储和检索交易,以长期保存NFT数据。Filecoin提供了一个使用加密证明的持久层,以确保NFT数据的持久性和持久性。 NFT.Storage将使用IPFS为所有新的NFT创建数字指纹,无论其存储方式或存储位置如何,该数字指纹都能通用地引用该内容,使用这些数字指纹来引用NFT资产和元数据可以。 安全的不确定性 不过,这里还有一些注意事项。尽管Filecoin声明NFT将在其服务上“保证长期安全可用”,但NFT.Storage并不能完全免除与其他第三方托管服务提供商相同的不确定性。因为Filecoin在NFT.Storage的声明中加入了免责条款:“Protocol Labs Inc.将持续为NFT用户提供免费存储服务,数据将无限期地永久保存,直到Protocol Labs决定结束NFT.storage项目为止,Protocol Labs Inc.保留自行决定终止NFT.storage的权利,Protocol Labs Inc.承诺在可能需要终止服务前90天内通知NFT爱好者,给用户足够的时间来安排通过其他方式存储其数据。“ 事实上,NFT.Storage服务的推出将能提升IPFS各节点存储数据的价值,毕竟NFT代表的是海量的高价值物品或文件,数字资产价值提升,必然更会引起恶意攻击者的注意,可以预见,针对IPFS的攻击将会更加密集与高级。因此,尽管NFT.Storage能为NFT创作者和所有者提供额外的安全保护层,但它依然可能存在一些不可避免的安全风险。

优秀的个人博客,低调大师

光子芯片研究重大突破:电脑性能暴增

“每隔24个月芯片晶体管数量增加一倍”,在过去四十年,Intel创始人之一戈登·摩尔提出的摩尔定律一直推送电子行业的发展。 但在过去几年,业内“摩尔定律”失效的声音不断,在9月26日的NVIDIA GTC大会上,黄仁勋在在开场后的前5分钟,就直截了当的表示“摩尔定律已经终结”——“设计人员无法再创造出以实现更高指令级并行性的CPU架构”“晶体管数每年增长50%,但CPU的性能每年仅增长10%”。 在未来,人类可能无法再靠过去晶体管堆叠的方式来提升计算机的性能,光子芯片被认为是未来的主要发展方向之一。 据新华社报道,英国牛津大学日前宣布,其研究人员在光子芯片研发方面取得突破,能够模拟人脑神经突触的结构形成可高速传递信息的“光子突触”,这种技术今后可能有助大幅提高电脑的速度。 牛津大学教授哈里什·巴斯卡兰表示,过去数十年,业内一直在致力于研发出能像人脑一样运转的电脑,大量神经元通过突触互相连接,同时处理和存储大量信息,十分高效,耗能也很低。 据了解,英国牛津大学的研究人员使用特殊的相变材料与集成光路开发出一种光子芯片,可形成与人脑相似的“光子突触”,其运行速度比人脑神经突触快1000倍。 值得一提的是,由于光信号的传输速度非常快,而且不会像电流传输一样发热,光子芯片前景被十分看好。此次研究今后可能会有助于大幅提升电脑运行速度。 本文转自d1net(转载)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册